2011-04-18 70 views

回答

9

你可以使用遙控器側的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');
+0

在SQL 2005/2008到2008R2之間,此行爲是否發生變化? – 2012-03-15 17:26:42

+0

@GaryKindel:不知道我明白你到底是什麼意思,但是感謝你的評論,我注意到我錯過了一件事,那就是在第一段代碼中字符串常量的開頭處的'N'。 (現在更新我的答案。)它在SQL Server 2008 R2中肯定是必需的,不確定早期版本。我想知道是否缺少'N'是你問這個問題的原因。 – 2012-03-15 18:14:48

+0

由於試圖通過鏈接服務器在INSERT上使用Scope_indentity(),導致我今天遇到了問題。在我的項目中,這個錯誤讓我無法防範。我只是想知道在SQL 2008中Scope_indentity()是否始終是本地的。認爲這可能是R2的新行爲。 – 2012-03-15 18:58:18

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,您可以將它們存儲在本地計算機上的表/表變量中。

+0

我試過了,但是它返回NULL。怎麼了?這是我的代碼:** exec('insert [(Worker)]。Identification.dbo.test(name)values(''gg''); select scope_identity()')** – 2011-04-18 21:35:17

+0

這不會奏效。它將返回NULL或0.它對於本地SQL數據庫將正常工作,但對鏈接的數據庫不會有效。 – WiredEarp 2016-04-20 04:42:49

1

另一種變型,如果鏈接的用戶有權限上調用程序鏈接服務器:

DECLARE @ScopeIdentity int 
EXEC @ScopeIdentity = [linkedServerName].[database].[schema].sp_executesql N' 
    INSERT INTO [table] ... 
    SELECT SCOPE_IDENTITY()' 
+0

我不得不使用這樣的OUTPUT參數: 'DECLARE @ScopeIdentity int EXEC [linkedServerName]。[database]。 [schema] .sp_executesql N' INSERT INTO [table] ... SELECT SCOPE_IDENTITY()',N'@ ScopeIdentityOUT INT OUTPUT',@ScopeIdentityOUT = @ScopeIdentity OUTPUT' – 2017-06-28 16:24:42

相關問題