Sql-Server

連結伺服器上更新失敗,選擇工作

  • April 1, 2022

我試圖了解為什麼我的本地伺服器上的更新語句在我的遠端伺服器上失敗。我收到以下錯誤:

連結伺服器“WEBDB”的 OLE DB 提供程序“SQLNCLI11”返回消息“多步 OLE DB 操作產生錯誤。檢查每個 OLE DB 狀態值(如果可用)。未完成任何工作。”。消息 7341,級別 16,狀態 4,第 1 行無法獲取列的目前行值“

$$ SQLNCLI11 $$.AdditionalBarcode”來自 OLE DB 提供程序“SQLNCLI11”,用於連結伺服器“WEBDB”。$$ COLUMN_NAME= AdditionalBarcode STATUS=Unknown DBBINDSTATUS $$

這是我的更新聲明

Update WEBDB SET Additionalbarcode = UDF_ADDITIONALBARCODE FROM
openquery(WEBDB, ' SELECT Id ,[AdditionalBarcode] FROM
...[ProductGroup] where IsActive = 1') WEBDB inner
join LocalDB..Items CI on WEBDB.Id = CI.itemcode where
nullif(UDF_ADDITIONALBARCODE,'') <> isnull(Additionalbarcode,'')

這是我的選擇語句

Select itemcode, UDF_AdditionalBarcode, Id, Additionalbarcode FROM
openquery([remoteserver], ' SELECT Id ,[AdditionalBarcode] FROM
...[ProductGroup] where IsActive = 1') WEBDB inner
join LocalDB..Items CI on WEBDB.Id = CI.itemcode where
nullif(UDF_ADDITIONALBARCODE,'') <> isnull(Additionalbarcode,'')

為什麼我會在 UPDATE 期間收到錯誤但沒有選擇?知道更新語句中錯誤的原因是什麼嗎?

我不知道為什麼會失敗,但可能有更好的選擇。

首先是避免專有和令人困惑的UPDATE FROM的一般最佳實踐:

從有效的 SELECT 開始,然後執行

with q as
(
Select itemcode, UDF_AdditionalBarcode, Id, Additionalbarcode FROM
openquery([remoteserver], ' SELECT Id ,[AdditionalBarcode] FROM
...[ProductGroup] where IsActive = 1') WEBDB inner
join LocalDB..Items CI on WEBDB.Id = CI.itemcode where
nullif(UDF_ADDITIONALBARCODE,'') <> isnull(Additionalbarcode,'')
)
update q set Additionalbarcode = UDF_ADDITIONALBARCODE

但我會走得更遠,先在本地簡單地後台處理 OPENQUERY 結果:

Select *
into #webdb
FROM openquery([remoteserver], ' SELECT Id ,[AdditionalBarcode] FROM
...[ProductGroup] where IsActive = 1') 

在跨連結伺服器工作時,明確說明您如何來回移動數據通常是最好的。

有什麼理由不能進一步簡化並使用四部分連結伺服器地址並完全放棄 OPENQUERY?

UPDATE  pg
SET     pg.Additionalbarcode = UDF_ADDITIONALBARCODE
FROM    WEBDB.DBName.dbo.ProductGroup AS pg
       INNER JOIN LocalDB..Items AS CI ON pg.Id = CI.itemcode
WHERE   1 = 1
       AND NULLIF(UDF_ADDITIONALBARCODE, '') <> ISNULL(pg.Additionalbarcode, '');

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