【问题标题】:SQL Server: Use output parameter values in the same procedure alsoSQL Server:也在同一过程中使用输出参数值
【发布时间】:2014-08-11 15:33:36
【问题描述】:

我有这个存储过程:

CREATE PROCEDURE [dbo].[AddEmployee]
    (
        @employeeId int OUTPUT,
        @firstName varchar(50),
        @lastName varchar(50),
        @password varchar(100)
    )
AS
BEGIN
    INSERT INTO Employees(FirstName, LastName)
    VALUES(@firstName, @lastName)

    INSERT INTO Logins(Password, EmployeeId)
    VALUES(@password, @employeeId)

    SELECT @@Identity
END
GO

让,

 @employeeId = EmployeeId 

在插入Employees时生成

之后,我试图将@employeeId 插入Logins 表中。

另外,@employeeId 用作OUTPUT 参数。

我该怎么做?

也许我们可以使用INSERTED.EmployeeId,但我不知道如何使用它。

【问题讨论】:

    标签: sql-server


    【解决方案1】:
    CREATE PROCEDURE [dbo].[AddEmployee] (
        @firstName VARCHAR(50)
        , @lastName VARCHAR(50)
        , @password VARCHAR(100)
        , @employeeId INT OUTPUT
        )
    AS
    BEGIN
        INSERT INTO Employees (
            FirstName
            , LastName
            )
        VALUES (
            @firstName
            , @lastName
            )
    
        SELECT @employeeId = SCOPE_IDENTITY()
    
        INSERT INTO Logins (
            Password
            , EmployeeId
            )
        VALUES (
            @password
            , @employeeId
            )
    
    END
    GO
    
    EXEC [dbo].[AddEmployee] @firstname = 'test'
        , @lastname = 'tester'
        , @password = '321321'
        , @employeeId = ''
    

    【讨论】:

    • 为什么你的存储过程以select @@identity结尾?
    • @Andomar 哦,这是从 OP 复制粘贴的,将其删除,因为它实际上改变了行为。感谢您的提示;)
    • 现在你的答案看起来不错,+1
    • +1 这个答案肯定比接受的答案好。唯一的改进应该是在末尾更新示例EXEC 以显示DECLARE @EmpID INT;,然后proc 调用的最后一行应该是:, @employeeId = @EmpID OUTPUT;。
    【解决方案2】:

    假设您的 EmployeeId 列是 IDENTITY 列,您应该使用 OUTPUT 子句来获取值(将其输出到表变量中):

    DECLARE @empId TABLE (empId int)
    
    INSERT INTO Employees
    (
        FirstName, LastName
    )
    OUTPUT INSERTED.EmployeeId INTO @empId
    VALUES
    (
        @firstName,
        @lastName
    )
    

    然后要将表变量中的值转换为标量变量,请执行以下操作:

    SET @employeeId = (SELECT TOP 1 empId FROM @empId)
    

    【讨论】:

    • +1 这应该可以正常工作。您的第二个查询可以缩写为select @employeeId = empId from @empId
    【解决方案3】:

    @@Identity 值是在当前会话中插入的最后一个身份,无论范围如何。因此,它可能是触发器插入的行的标识。最好改用scope_identity()。更多详情,see MSDN。

    您可以分配一个输出参数,例如:

    set @employeeId = scope_identity()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      相关资源
      最近更新 更多