T-SQL卡在存储过程的scope_identity中

时间:2018-10-13 15:20:11

标签: sql-server tsql

我确定这是一个简单的解决方法,但是我在这里找不到答案。自从我编写存储过程已经有很多年了。

这些是我的程序:

第一个有效,并返回新创建的ID。

ALTER PROCEDURE [dbo].[sp_CreateBytegymType]
    @Name NVARCHAR(200),
    @Type NCHAR(1),
    @Description NVARCHAR(MAX) NULL,
    @Comment NVARCHAR(MAX) NULL,
    @Source NVARCHAR(MAX) NULL,
    @BtId INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON

    INSERT INTO BytegymType
    VALUES (@Name, @Type, @Description, @Comment, @Source)

    SET @BtId = CAST(SCOPE_IDENTITY() AS INT)    
END

第二个呼叫第一个:

ALTER PROCEDURE [dbo].[sp_CreateMuscle]
    @Name NVARCHAR(200),
    @Type NCHAR(1),
    @Description NVARCHAR(MAX) NULL,
    @Comment NVARCHAR(MAX) NULL,
    @Source NVARCHAR(MAX) NULL,
    @Group NVARCHAR(20) NULL
AS
BEGIN
    DECLARE @BtId int

    EXEC sp_CreateBytegymType
                @Name = @Name,
                @Type = @Type,
                @Description = @Description,
                @Comment = @Comment,
                @Source = @Source,
                @BtId = @BtId

    INSERT INTO Muscle
    VALUES (@BtId, @Group)
END

我收到以下错误:

  

消息515,级别16,状态2,过程sp_CreateMuscle,第20行[批处理开始第2行]
  无法将NULL值插入“ BtId”列

似乎我没有保留@BtId的值。执行sp_CreateBytegymType之后是否需要将其放入新值?

我也想以交易的方式做到这一点。因此,如果Muscle插入失败,则应回滚存储过程插入。

1 个答案:

答案 0 :(得分:4)

您需要添加OUTPUT

exec sp_CreateBytegymType
    @Name = @Name,
    @Type = @Type,
    @Description = @Description,
    @Comment = @Comment,
    @Source = @Source,
    @BtId = @BtId OUTPUT;

也不建议在用户定义的存储过程中加上sp_作为前缀。相关文章:Is the sp_ prefix still a no-no?