SCOPE_IDENTITY,多个插入操作,如果当前插入操作未插入,则使用上一个插入操作的值。

4
**编辑:已解决 - 谢谢大家!由于我的声望不高,我无法“投票支持”你们的回复,但我很感激!**
**编辑2:现在我的声望足够高了,给所有人投票支持!**
好的,我有一个存储过程运行一些插入操作,将新记录标识分配给一个变量,然后将它们插入另一个表中。问题是有些插入操作不会插入数据(如果没有要插入的数据),但 SCOPE_IDENTITY(); 从上一个插入操作继承下来...
在下面的代码中,我希望 @NewId2 是空的,但它包含了上一个插入操作的id。我应该怎么做才能防止 @NewId2 有“错误的id”?
CREATE TABLE #tempdemo (
theId int IDENTITY(100,3),
theField varchar(20)
)

DECLARE @NewId1 int
DECLARE @NewId2 int

INSERT INTO 
#tempdemo
    (theField)
SELECT
    'test1'
--this would have a "from table" in a real situation
WHERE
    1 = 1

SET @NewId1 = SCOPE_IDENTITY();

INSERT INTO 
#tempdemo
    (theField)
SELECT
    'test2'
--this would have a "from table" in a real situation
WHERE
    1 = 2 --obviously fails, in my real situation there are times the insert has nothing to insert

SET @NewId2 = SCOPE_IDENTITY();


select '@NewId1 = ', @NewId1, '@NewId2 = ', @NewId2


drop table #tempdemo
3个回答

8

如果@@rowcount大于0,在插入后将scope_identity()保存在变量中。

例如:

DECLARE @MY_NEW_ID INT

INSERT INTO TABLE2 (COL1)
SELECT VAL1
FROM TABLE1
WHERE X=Y

IF @@ROWCOUNT>0
BEGIN
   SET @MY_NEW_ID  = SCOPE_IDENTITY()
END

/* DO MORE INSERTS HERE ... */

IF @MY_NEW_ID IS NOT NULL
BEGIN
   INSERT INTO TABLE3 (NEWID) VALUES @MY_NEW_ID  
END

3
你可以尝试这样做:
IF @@ROWCOUNT<>0
  SET @NewId2 = SCOPE_IDENTITY();

1

您可以使用@@ROWCOUNT检查插入的行数。

例如:

IF (@@ROWCOUNT > 0)
BEGIN
    -- Other inserts
END

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接