Sql server T-SQL卡在存储过程返回的作用域标识上

Sql server T-SQL卡在存储过程返回的作用域标识上,sql-server,tsql,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)

我相信这是一个简单的解决办法,但我在这里找不到答案。我写存储过程已经很多年了

以下是我的程序:

第一个有效,并返回新创建的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
我得到以下错误:

Msg 515,16级,状态2,程序sp_CreateMuscle,第20行[批次开始第2行] 无法将值NULL插入列“BtId”

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

此外,我希望以事务性的方式进行此操作。因此,如果insert-into-Muscle失败,它应该回滚存储过程insert。

您需要添加输出:

另外,不建议在用户定义的存储过程前面加上sp_u。相关文章:

您需要添加输出:


另外,不建议在用户定义的存储过程前面加上sp_u。相关文章:

旁注:存储过程不应使用sp_uu前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp_u,并使用其他东西作为前缀——或者根本不使用前缀!旁注2:SCOPE_IDENTITY已经返回一个INT通常-如果表中的IDENTITY列定义为INT-在将其分配给@BtId时确实不需要将其转换为INT…Re:问题的第二部分:请参阅事务中使用TRY…CATCH的示例B和C。旁注:不应该为存储的字符串使用sp_前缀程序。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp_u,并使用其他东西作为前缀——或者根本不使用前缀!旁注2:SCOPE_IDENTITY通常已返回INT-如果表中的标识列定义为INT-在将其分配给@BtId时,确实不需要将其强制转换为INT…Re:问题的第二部分:请参阅事务中使用TRY…CATCH的示例B和C。
exec sp_CreateBytegymType
    @Name = @Name,
    @Type = @Type,
    @Description = @Description,
    @Comment = @Comment,
    @Source = @Source,
    @BtId = @BtId OUTPUT;