我有一个链接服务器, 我想在链接服务器上的表中添加一条记录, 是否可以从具有链接服务器的其他服务器获取@@ identity? (SQL Server 2005)
答案 0 :(得分:5)
答案 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 ()'