代码之家  ›  专栏  ›  技术社区  ›  BG100

调用从存储过程中返回记录集的存储过程

  •  0
  • BG100  · 技术社区  · 14 年前

    在SQL Server 2005中,我有一个存储过程,它插入一条记录并通过SELECT@@IDENTITY;作为最后一个命令返回新的ID。

    然后我想从另一个存储过程调用它,并获取新ID的值。

    例子:

    CREATE PROCEDURE spMyInsert(@Field1 VARCHAR(10)) AS 
    BEGIN
    
        INSERT INTO tMyTable (Column1) VALUES (@Field1); // ID column implicitly set
    
        SELECT @@IDENTITY ID;
    
    END
    
    
    CREATE PROCEDURE spMyMain AS
    BEGIN
    
        DECLARE @NewID INT;
    
        EXEC spMyInsert 'TEST';
    
        // How do I set @NewID to the value returned from spMyInsert?
    
    END
    

    还有一个 question

    看看其他类似的问题,一般的答案是要么设置一个输出变量,要么创建一个函数来完成它,但我不能这样做,因为其他.NET数据访问的东西使用相同的存储过程,我不想把存储过程的所有工作都复制为函数。

    我试过但都失败的几件事是:

    SET @NewID = (EXEC spMyInsert 'TEST');
    
    SET @NewID = (SELECT ID FROM (EXEC spMyInsert 'TEST'));
    

    谢谢, 本

    5 回复  |  直到 8 年前
        1
  •  4
  •   Martin Smith    14 年前

    @@identity 是你所需要的,而不是 scope_identity

    如果它 您需要的是,它仍然可以在调用存储过程中访问。

    CREATE PROCEDURE spMyMain 
    AS
    BEGIN
        DECLARE @NewID INT;
    
        EXEC spMyInsert 'TEST';
    
        SET @NewID = @@IDENTITY
    
        SELECT @NewID AS '@NewID'
    
    END
    

    如果您使用 范围\u标识 并且既不想使用输出参数,也不想使用过程返回代码

    CREATE PROCEDURE spMyMain AS
    BEGIN
    
     DECLARE @NewID INT;
    
        DECLARE @IdHolder TABLE
        (
        id INT
        )
    
        INSERT INTO @IdHolder
        EXEC spMyInsert 'TEST';
    
        IF @@ROWCOUNT<>1
        RAISERROR('Blah',16,1)
    
         SELECT @NewID = id FROM @IdHolder
    
    END
    
        2
  •  2
  •   Pondlife    14 年前

    首先,不要使用@@IDENTITY,而是使用SCOPE\u IDENTITY()(搜索此网站或Google以了解原因)。然后返回输出参数中的值:

    CREATE PROCEDURE spMyInsert(@Field1 VARCHAR(10), @NewID int output) AS  
    BEGIN 
        INSERT INTO tMyTable (Column1) VALUES (@Field1);
        SET @NewID = scope_identity();
    END 
     go
    
    CREATE PROCEDURE spMyMain AS 
    BEGIN 
         DECLARE @NewID INT; 
         EXEC spMyInsert @Field1 = 'TEST', @NewID = @NewID OUTPUT; 
    END
    go
    
        3
  •  2
  •   codingbadger    14 年前

    这里的问题是 spMyInsert 返回一个Select。当你执行 spMyMain 它将返回Select from spMyInsert公司 然后选择 spMyMain公司

    我建议你修改一下 spMyInsert公司 利用 OUTPUT 参数

    CREATE PROCEDURE spMyInsert(@Field1 VARCHAR(10), @NewId int output) AS 
    BEGIN
    
        INSERT INTO tMyTable (Column1) VALUES (@Field1); // ID column implicitly set
    
        SELECT @NewId = @@SCOPE_IDENTITY;
    
    END
    

    然后

    CREATE PROCEDURE spMyMain AS
    BEGIN
    
        DECLARE @NewID INT;
    Set @NewId = 0
    
        EXEC spMyInsert 'TEST', @NewId output;
    
    select @NewId
        // How do I set @NewID to the value returned from spMyInsert?
    
    END
    

    @@Identity @@scope_identity 最好使用 @@Scope_Identity

        4
  •  1
  •   Wix    14 年前

    试试这个:

    Execute @NewID = spMyInsert 'TEST'
    

    Edit:在更透彻地阅读了他的问题并意识到他处理的是select而不是return之后:你能把这个过程包装成一个函数调用,然后调用这个函数吗?

    select @NewId = from fnMyInsert('TEST')
    
        5
  •  1
  •   Andrew Carmichael    14 年前

    如。

    declare @NewID int,
    @Customer table(CustomerId int);
    
    insert into @Customer
    exec spMyInsert 'TEST';
    
    select @NewID = CustomerId from @Customer;