Sql server T-SQL卡在存储过程返回的作用域标识上
我相信这是一个简单的解决办法,但我在这里找不到答案。我写存储过程已经很多年了 以下是我的程序: 第一个有效,并返回新创建的IdSql 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)
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;