選擇並插入連結伺服器
我無法理解連結伺服器的情況。
所以我們有一個從 2008R2 伺服器到 2014 伺服器的連結伺服器。下面的範例查詢是從 2008R2 伺服器執行的,它工作正常。
SET XACT_ABORT ON; Declare @BatchSize int = 10 DELETE from LINKEDSRV.DB.DBO.Table INSERT INTO LINKEDSRV.DB.DBO.Table (ECN) SELECT TOP (10) C1 from LINKEDSRV.DB.DBO.Table22 --order by C1 SELECT * FROM LINKEDSRV.DB.DBO.Table
但是當我用它執行相同的事情時,
order by C1
它不會返回任何結果。第二種情況 - 如果我替換
TOP(10)
withTOP(@BatchSize)
並且 noorder by
我也沒有得到任何結果。例如SELECT TOP (@BatchSize) C1 from LINKEDSRV.DB.DBO.Table22
如果我
SET XACT_ABORT OFF
. 那麼 XACT_ABORT 在連結伺服器方面是否有任何限制?編輯- 做了更多的測試,看起來它也與行數有關
可能的回購
在伺服器 A 上
use testdb go create table t1( c1 int, c2 datetime) create table t2( c1 int, c2 datetime) insert into t2 select 1, GETDATE() insert into t2 select * from t2 -- insert close to 5000 rows, I found the issue around over around 35000 rows
在伺服器 B
創建到 ServerA 的連結伺服器
SET XACT_ABORT ON; Declare @BatchSize int = 10 delete from ServerA.testdb.dbo.t1 insert into ServerA.testdb.dbo.t1 (c1) select top (@BatchSize) c1 from ServerA.testdb.dbo.t2 --order by c2 select * from ServerA.testdb.dbo.t1
沒有輸出。但是,如果您將表 t2 中的行數減少到 2000 左右,它就可以正常工作。
如果我
SET XACT_ABORT OFF
. 那麼XACT_ABORT
對於連結伺服器有什麼限制嗎?的設置
XACT_ABORT
傳播到遠端 SQL Server,如處理伺服器到伺服器遠端儲存過程中的錯誤中所述。如分佈式查詢和分佈式事務中所述,該設置還會影響是否可以更新以及如何處理它們。你
INSERT
是允許的,XACT_ABORT OFF
因為 SQL Server 支持嵌套事務。然而,似乎存在一個實現錯誤,因為在插入期間跟踪 2014 伺服器上的活動顯示當 SQL Server 嘗試釋放架構鎖時發生錯誤:
此錯誤中止遠端伺服器上的語句(嘗試釋放模式鎖),但當
XACT_ABORT
is時OFF
,遠端伺服器繼續處理下一條語句。儘管模式鎖定釋放錯誤,插入仍完成。當
XACT_ABORT
isON
時,整個遠端批處理被中止,因此插入被回滾。我能夠在本地重現您的問題,但該
ORDER BY
條款並不重要。您可以通過多種方式避免該問題,包括將 包裝
INSERT
在顯式事務中(假設您可以使用 DTC)。我建議您避免遠端更改的四部分名稱語法,因為實現是基於游標模型的。通常使用批量方法或通過在遠端伺服器上拉數據(而不是從本地伺服器推送數據)可以獲得更好的性能。