我在使用鏈接服務器的遠程Sql Server中插入記錄,現在我想獲取插入記錄的ID。像本地服務器中的scope_identity()
。 我的遠程SQL服務器是2000版本。在鏈接服務器中獲取插入行的身份的最佳方法?
我見過this post但我不能在遠程SQL Server添加任何存儲過程
我在使用鏈接服務器的遠程Sql Server中插入記錄,現在我想獲取插入記錄的ID。像本地服務器中的scope_identity()
。 我的遠程SQL服務器是2000版本。在鏈接服務器中獲取插入行的身份的最佳方法?
我見過this post但我不能在遠程SQL Server添加任何存儲過程
你可以使用遙控器側的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');
嘗試這樣的事:
--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
,您可以將它們存儲在本地計算機上的表/表變量中。
我試過了,但是它返回NULL。怎麼了?這是我的代碼:** exec('insert [(Worker)]。Identification.dbo.test(name)values(''gg''); select scope_identity()')** – 2011-04-18 21:35:17
這不會奏效。它將返回NULL或0.它對於本地SQL數據庫將正常工作,但對鏈接的數據庫不會有效。 – WiredEarp 2016-04-20 04:42:49
另一種變型,如果鏈接的用戶有權限上調用程序鏈接服務器:
DECLARE @ScopeIdentity int
EXEC @ScopeIdentity = [linkedServerName].[database].[schema].sp_executesql N'
INSERT INTO [table] ...
SELECT SCOPE_IDENTITY()'
我不得不使用這樣的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
在SQL 2005/2008到2008R2之間,此行爲是否發生變化? – 2012-03-15 17:26:42
@GaryKindel:不知道我明白你到底是什麼意思,但是感謝你的評論,我注意到我錯過了一件事,那就是在第一段代碼中字符串常量的開頭處的'N'。 (現在更新我的答案。)它在SQL Server 2008 R2中肯定是必需的,不確定早期版本。我想知道是否缺少'N'是你問這個問題的原因。 – 2012-03-15 18:14:48
由於試圖通過鏈接服務器在INSERT上使用Scope_indentity(),導致我今天遇到了問題。在我的項目中,這個錯誤讓我無法防範。我只是想知道在SQL 2008中Scope_indentity()是否始終是本地的。認爲這可能是R2的新行爲。 – 2012-03-15 18:58:18