在链接服务器中获取插入行的标识的最佳方法是什么?

时间:2011-04-18 21:15:01

标签: sql-server sql-server-2000 linked-server

我使用链接服务器在远程Sql Server中插入记录,现在我想获取插入记录的id。像本地服务器中的scope_identity()之类的东西。 我的远程sql server是2000版。

我见过this post但我无法在远程sql server

中添加任何存储过程

3 个答案:

答案 0 :(得分:11)

您可以使用远程端的sp_executesql

DECLARE @ScopeIdentity (ID int);
INSERT INTO @ScopeIdentity
EXEC server.master..sp_executesql N'
  INSERT INTO database.schema.table (columns) VALUES (values);
  SELECT SCOPE_IDENTITY()';
SELECT * FROM @ScopeIdentity;

或者,您可以使用OPENQUERY

SELECT *
FROM OPENQUERY(server, '
  INSERT INTO database.schema.table (columns) VALUES (values);
  SELECT SCOPE_IDENTITY() AS ID');

答案 1 :(得分:2)

另一种变体,如果链接用户有权在链接服务器上调用过程:

DECLARE @ScopeIdentity int
EXEC [linkedServerName].[database].[schema].sp_executesql N'
  INSERT INTO [table] ...
  SELECT @ScopeIdentityOut = SCOPE_IDENTITY()',
  N'@ScopeIdentityOut INT OUTPUT',
  @ScopeIdentityOut = @ScopeIdentity OUTPUT

在2019-04-29更新了每条评论。

答案 2 :(得分:0)

尝试这样的事情:

--when RemoteTable is (Rowid int identity(1,1) primary key, rowValue varchar(10))
exec ('INSERT server.database.owner.RemoteTable (rowValue) VALUES (''wow'');select SCOPE_IDENTITY()')

EXEC将返回包含SCOPE_IDENTITY()

的结果集

如果您必须为SQL Server 2005+执行此操作,则只需添加OUTPUT INSERTED.IdentityColumn即可获取该身份的结果集。在INTO上添加OUTPUT,您可以将它们存储在本地计算机上的表/表变量中。