0

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

在此处输入图像描述

TableB 的 RowID 列显然是一个 int,而不是设置为标识自动增量或类似的东西。

如果我在管理工作室中运行它,它会说 1 行受到影响,但它不会插入。

如果我从代码中运行它,我会收到一条错误消息,说我无法在 TableB 中插入 NULL 值,RowID 是正确的,它有一个非空约束。但它应该从第一个表中获取 scope_identity() 。

我已经在事务和各种参数初始化中尝试过它......这让我很生气。提前感谢您的任何帮助。

4

3 回答 3

1

我假设 tableA 在数字列上设置了 IDENTITY?

如果没有,SCOPE_IDENTITY() 将为 NULL

“受影响的 1 行”也不是来自这个 INSERT 到 tableA 中。

于 2011-06-20T19:37:07.743 回答
1

您在此处显示的代码没有任何问题。我认为您在简化示例时已经删除了有问题的代码。

尝试这个。

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-20T20:51:07.253 回答
1

要查看的另一件事是您是否在表上有一个触发器(尤其是 INSTEAD OF 触发器),这可能导致记录无法插入。

在初始化 @newId 变量后,您可以添加一条打印语句来查看它的值,以查看它是否为空或是否有值。

尝试使用显式事务和 try catch 块,然后您可以看到如果 catch 块没有超过第一次插入,您会在 catch 块中遇到什么错误。

于 2011-06-20T20:57:33.700 回答