2017-12-27 328 views
0

工作,我已經在我做的插入,並通過調用SCOPE_IDENTITY()SQL服務器:起牀SCOPE_IDENTITY()不與鏈接服務器

... 
INSERT INTO [RemoteDB].[dbo].[Table] (StageID, UserID, Date) 
VALUES (4, @userID, @date) 

SET @id = SCOPE_IDENTITY() 

INSERT INTO [RemoteDB].[dbo].[Table2] (ID) 
VALUES (@id) 
... 

一切檢索該行的ID存儲過程工作正常,當我我的3數據庫在同一臺服務器上,但在生產中,其中一個數據庫是遠程的(所以我使用鏈接服務器)。

我的查詢的第一次插入工作,但第二次插入不運行。我認爲這是因爲SCOPE_IDENTITY()

我的錯誤是:

的OLE DB提供程序未能INSERT INTO ... 「的值違反了該列的完整性約束。」。

這意味着它不能夠得到的SCOPE_IDENTITY()

需要注意的是,我執行存儲過程不是在遠程服務器上的@id,他們在當地的一個。

我做錯了什麼?

enter image description here

+0

我知道,因爲它沒有檢索ID,但當我在同一臺服務器上擁有所有數據庫時,它會檢索它。 – user3127554

+0

INSERT INTO [RemoteDB]。[dbo]。[Table](StageID,UserID,Date) OUTPUT Inserted.ID VALUES(4,@ userID,@date)'這可以有什麼幫助嗎? –

+0

我的第一張插入作品,插入了一行。但它不會得到該行的ID(當我使用遠程srv) – user3127554

回答

1

SCOPE_IDENTITY(以及類似)是行不通的,你想與鏈接服務器的方式。從MSDN docs

返回插入標識列在 同一範圍內的最後一個標識值。範圍是一個模塊:存儲過程,觸發器,函數或批處理。因此,如果兩個語句在同一個存儲過程,函數或批處理中,它們處於相同的範圍。

由於您的插入正在您的遠程服務器上發生,並且您的SCOPE_IDENTITY調用是在本地進行的,所以它們在不同的作用域內執行。因此你的SCOPE_IDENTITY調用可能返回NULL,因此違反約束。

你有幾個選擇來解決這個問題。第一種方法是在遠程服務器上編寫一個可執行的存儲過程,以便a)處理一個proc中的所有插入,或者b)處理單個插入並返回插入的標識。 (或者,您可以使用dynamic-sql-esque解決方案在遠程服務器上執行與建議的存儲過程相同的語句。)無論您選擇做什麼,最終目標都是您必須確保撥打SCOPE_IDENTITY發生在同一批次的遠程服務器上,否則無法工作。