SCOPE_IDENTITY,多个插入,如果当前插入没有插入,则携带前一个插入的值

Posted

技术标签:

【中文标题】SCOPE_IDENTITY,多个插入,如果当前插入没有插入,则携带前一个插入的值【英文标题】:SCOPE_IDENTITY, multiple inserts, carries value from previous insert if current insert doesn't insert 【发布时间】:2014-08-22 17:29:33 【问题描述】:

**编辑:已解决 - 谢谢大家!由于我的声望低,我无法“投票”您的任何回复,但我很感激他们!

编辑 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

【问题讨论】:

【参考方案1】:

插入后,如果@@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

【讨论】:

【参考方案2】:

你可以试试这个:

IF @@ROWCOUNT<>0
  SET @NewId2 = SCOPE_IDENTITY();

【讨论】:

【参考方案3】:

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

例如

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

【讨论】:

以上是关于SCOPE_IDENTITY,多个插入,如果当前插入没有插入,则携带前一个插入的值的主要内容,如果未能解决你的问题,请参考以下文章

SCOPE_IDENTITY的用法

@@IDENTITY与SCOPE_IDENTITY的用法

在插入时插入 SCOPE_IDENTITY

SCOPE_IDENTITY 在这种情况下是不是有效?

插入值时的 SCOPE_IDENTITY

为啥 SCOPE_IDENTITY() 不返回我插入的 ID?