在Sql Server中获取我更新的行的Id

32

我试图返回我在SQL中更新的行的ID。

UPDATE ITS2_UserNames
  SET AupIp = @AupIp
  WHERE @Customer_ID = TCID AND @Handle_ID = ID

  SELECT @@ERROR AS Error, @@ROWCOUNT AS RowsAffected, SCOPE_IDENTITY() AS ID

我一直收到ID为Null,我该如何获取它?

4个回答

65
< p > < code >@@identity和scope_identity()会将新增行的标识符(identity)返回给您,即在插入之后。更新后,该行的标识符是... @Customer_ID还是@Handle_Id?如果它是不同的字段,则应使用OUTPUT子句返回更新行的ID:

UPDATE ITS2_UserNames  
SET AupIp = @AupIp  
OUTPUT INSERTED.PrimaryKeyID
WHERE @Customer_ID = TCID AND @Handle_ID = ID

我找不到任何证据表明这在SQL Server 2000上有效...既不是来自我的记忆,也不是来自任何博客文章或官方文档。事实上,在SQL Server 2005 Books Online中有几个地方都吹嘘“新的OUTPUT子句”。当我在2000中尝试上述操作时,我会得到语法错误,正如我所预期的那样。你怎么能相信这在SQL Server 2000中有效?也许这是一个无意义的问题。但希望有一种方法可以强制要求包括版本信息。 - Aaron Bertrand
@Aaron:代码讨论了使用 SCOPE_IDENTITY(),抱歉造成混淆,我删除了自己的一条评论,这破坏了意思。 - Remus Rusanu
1
我被卡住了,花了半个小时试图弄清楚为什么每个人突然认为 OUTPUT 在 2000 年得到了支持。我只有 99.99999% 的把握它没有得到支持。 :-) - Aaron Bertrand
很棒的答案!如果你想将输出存储到一个变量中,只需声明一个表变量并使用INTO关键字。像这样: DECLARE @myTableVar TABLE(id INT)UPDATE ... SET ... OUTPUT inserted.PrimaryKeyID INTO @myTableVar WHERE ...(我无法写出变量符号@,所以请用(a)代替) - Björn
@@identity and scope_identy() only works if datatype of primary key is integer. If you use uniqueidentifier datatype then we must use OUTPUT INSERTED - Bhavik Jani
如果您在插入和查询@@identity之间使用触发器或其他跳转,@@identity将返回错误的值。如果支持,请使用scope_identity()。 - TamusJRoyce

9

我认为@pauloya试图表达的是:

如果你要更新一个表,那么你需要使用WHERE子句。因此,如果你在一个带有INTO #tempTable的select语句中使用相同的where子句,你就可以得到所有受到你的UPDATE影响的行。

所以你可以这样做:

SELECT
    userName.ID
INTO #temp
FROM ITS2_UserNames AS userNames
WHERE @Customer_ID = TCID AND @Handle_ID = ID

然后您进行更新。
UPDATE ITS2_UserNames
SET AupIp = @AupIp
WHERE @Customer_ID = TCID AND @Handle_ID = ID

最后,您可以返回所有受您更新影响的ID。
SELECT * FROM #temp

你可以使用OUTPUT来完成这个操作,但你需要声明一个变量表格,例如:
DECLARE @tempTable TABLE ( ID INT );

接着您使用OUTPUT

UPDATE ITS2_UserNames  
SET AupIp = @AupIp  
OUTPUT INSERTED.ID
INTO @tempTable
WHERE @Customer_ID = TCID AND @Handle_ID = ID

3

在这里提一下,如果你想把受影响的行的主键存入变量中,可以使用OUTPUT子句,将其放入表变量中。以下是示例执行语句...

CREATE TABLE ItemTable(ID INT IDENTITY(1,1), Model varchar(500) NULL, Color VARCHAR(50) null)

INSERT INTO ItemTable(Model, Color) VALUES('某型号', '黄色')

INSERT INTO ItemTable(Model, Color) VALUES('某型号', '红色')

INSERT INTO ItemTable(Model, Color) VALUES('某型号', '粉色')

DECLARE @LastUpdateID TABLE(ItemID INT null)

UPDATE ItemTable SET model = 'abc' OUTPUT INSERTED.ID INTO @LastUpdateID WHERE Color = '红色'

SELECT ItemID FROM @LastUpdateID

输入图像描述


-2
如果您想查找与该更新匹配的记录,则应使用它进行选择。
Select IdColumn
From ITS2_UserNames
WHERE @Customer_ID = TCID AND @Handle_ID = ID  

1
如果您正在更新一个列并且同时进行选择,则此方法将无法正常工作。 - Talon

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