我不明白为什么这个使用scope_identity()的多表插入(存储过程)不起作用。这就是它的要点(请原谅这里缺乏想象力的命名):

表B的RowID列显然是一个整数,没有被设置为标识自动递增或类似的东西。
如果我在management studio中运行它,它会显示1行受到影响,但它不会执行插入操作。
如果我从代码中运行它,我得到一个错误,我不能在TableB,RowID中插入空值,这是正确的,它有一个非空值约束。但是它应该从第一个表中获取scope_identity()。
我已经在事务内和事务外尝试过它,并使用各种参数初始化...我要死了。提前感谢您的帮助。
发布于 2011-06-21 03:37:08
我假设tableA在数字列上设置了标识?
如果没有,SCOPE_IDENTITY()将为NULL
"1行受影响“也不是来自此插入到tableA中。
发布于 2011-06-21 04:51:07
这里显示的代码没有任何错误。我认为在简化示例时,您已经删除了有问题的代码。
尝尝这个。
declare @TableA table (IDA int identity primary key, ColA int)
declare @TableB table (IDB int primary key, ColB int)
declare @RecordID int = 0,
@Val1 int
if @RecordID = 0
begin
declare @NewID int
insert into @TableA values (@Val1)
set @NewID = scope_identity()
insert into @TableB values (@NewID, @Val1)
end
else
begin
print 'Do something else'
end
select *
from @TableA, @TableB结果:
IDA ColA IDB ColB
----------- ----------- ----------- -----------
1 NULL 1 NULL你自己去兜风吧。https://data.stackexchange.com/stackoverflow/q/103697/using-scope-identity
发布于 2011-06-21 04:57:34
要查看的另一件事是,表上是否有触发器(特别是INSTEAD OF触发器),这可能会导致记录无法插入。
在初始化@newId变量之后,您可以添加一条print语句来查看它的值,以查看它是否为null或是否具有值。
尝试使用显式事务和Try catch块,如果catch块没有通过第一个insert,那么您就可以看到在catch块中得到了什么错误。
https://stackoverflow.com/questions/6416403
复制相似问题