Sql server 从其他服务器(链接服务器)获取@标识

Sql server 从其他服务器(链接服务器)获取@标识,sql-server,linked-list,identity,Sql Server,Linked List,Identity,我有一个链接服务器, 我想在链接服务器的表中添加一条记录, 是否可以从另一个具有链接服务器的服务器获取@标识?(SQL Server 2005)您可以在链接服务器上创建一个存储过程,该过程将返回标识 顺便说一下,您应该使用SCOPE\u IDENTITY()而不是@@IDENTITY 请参阅相关问题(获取插入行标识的最佳方法?。此处使用SQL Server 2012 我尝试了gbn方法,但出现以下错误: Msg 405, Level 16, State 1, Line 1 A remote ta

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

您可以在链接服务器上创建一个存储过程,该过程将返回标识

顺便说一下,您应该使用
SCOPE\u IDENTITY()
而不是
@@IDENTITY


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

此处使用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.
除此之外,我还需要添加
设置XACT\u ABORT ON在我使用分布式事务时的语句之前

exec [MyRemoteServer].MyRemoteBD.dbo.sp_executesql N'
    INSERT INTO SomeTable (col1,col2,...) 
    VALUES (val1,val2,...); 
    SELECT SCOPE_IDENTITY ()'
因此,我最终通过这样做解决了这两个问题:

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
我能够在分布式事务中运行它,同时从插入中获取身份

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

编辑:

尝试了另一种方法,它不需要在分布式事务上设置
XACT\u ABORT ON
,并且在没有事务的情况下工作良好

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

创建存储过程的意义是什么?我正在运行这个链接服务器代码:“insert-into[(local)].Identification.dbo.test(name)values('gg')”现在我应该怎么做才能获得插入记录的id?@Raymond Morphy-我的意思就是这样。在链接的服务器上用该代码创建一个存储过程,让它返回
SCOPE\u IDENTITY()
,您应该可以了。您的查询只能访问本地服务器变量,不能访问远程服务器变量。这是否意味着我应该在远程服务器的存储过程中放入insert语句,然后再放入SCOPE_IDENTITY()?但我不能将存储过程添加到远程SQL server,它是以前设计的。“我能做什么?”雷蒙德·莫菲——我明白了。你真的应该提到那个“小”细节。您唯一的选择是使用在WHERE子句中输入的所有相同值在同一个表上进行选择。这取决于远程数据库中的结构和数据,可能有效,也可能无效。