从另一台服务器获取@@ Identity(链接服务器)

时间:2010-12-27 08:56:24

标签: sql-server linked-list identity

我有一个链接服务器, 我想在链接服务器上的表中添加一条记录, 是否可以从具有链接服务器的其他服务器获取@@ identity? (SQL Server 2005)

2 个答案:

答案 0 :(得分:5)

您可以在链接服务器上创建将返回标识的存储过程。

顺便说一句,你应该使用SCOPE_IDENTITY()而不是@@IDENTITY

请参阅this相关问题(获取插入行标识的最佳方法?)。

答案 1 :(得分:0)

在此处使用SQL Server 2012。

我尝试过gbn方法,但我收到了这个错误:

Msg 405, Level 16, State 1, Line 1
A remote table cannot be used as a DML target in a statement which includes an OUTPUT clause or a nested DML statement.

除此之外,我需要在语句之前添加SET XACT_ABORT ON;,因为我使用的是分布式事务。

所以我最终解决了这两个问题:

BEGIN DISTRIBUTED TRANSACTION

SELECT idcolumn
FROM OPENQUERY(MyRemoteServer, '
  SET XACT_ABORT ON;
  INSERT INTO MyRemoteBD.dbo.SomeTable(col1,col2, ...) 
  OUTPUT INSERTED.idcolumn
  VALUES (val1,val2, ...);
  SET XACT_ABORT OFF');

COMMIT

我可以在分布式事务中运行它,同时从我的插入中获取Identity。

关于这个语句的一个奇怪的行为是,如果我先前运行Insert语句而不打开分布式事务(必须是分布式事务),它将返回下一个Identity,但不会插入任何内容。我不知道为什么会这样。

编辑:

尝试了另一种方法,它无需在分布式事务上设置XACT_ABORT ON就可以正常工作,并且无需事务即可正常工作。

exec [MyRemoteServer].MyRemoteBD.dbo.sp_executesql N'
    INSERT INTO SomeTable (col1,col2,...) 
    VALUES (val1,val2,...); 
    SELECT SCOPE_IDENTITY ()'