我确定这是一个简单的解决方法,但是我在这里找不到答案。自从我编写存储过程已经有很多年了。
这些是我的程序:
第一个有效,并返回新创建的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插入失败,则应回滚存储过程插入。
答案 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?