Sql-Server

選擇並插入連結伺服器

  • October 7, 2017

我無法理解連結伺服器的情況。

所以我們有一個從 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_ABORTis時OFF,遠端伺服器繼續處理下一條語句。儘管模式鎖定釋放錯誤,插入仍完成。

XACT_ABORTisON時,整個遠端批處理被中止,因此插入被回滾。

我能夠在本地重現您的問題,但該ORDER BY條款並不重要。

您可以通過多種方式避免該問題,包括將 包裝INSERT在顯式事務中(假設您可以使用 DTC)。

我建議您避免遠端更改的四部分名稱語法,因為實現是基於游標模型的。通常使用批量方法或通過在遠端伺服器上數據(而不是從本地伺服器推送數據)可以獲得更好的性能。

查看相關問答哪個更高效:從連結伺服器中選擇還是插入連結伺服器?

引用自:https://dba.stackexchange.com/questions/185148