當您使用 OpenQuery 函數執行更新、插入或刪除遠端資料表中的 Transact-sql 語句時,出現錯誤訊息: "7357" 和 "7320"

徵狀

使用 OpenQuery 函數以下列方式更新、刪除或插入資料的分散式查詢

exec sp_dropserver 'linked1', 'droplogins'exec sp_addlinkedserver 'linked1', 'SQL Server'exec sp_setnetname  'linked1', '<servername>'exec sp_addlinkedsrvlogin 'linked1', 'false', null, '<login name>', '<password>'SET ANSI_NULLS ONgoSET ANSI_WARNINGS ONgoselect * from openquery (linked1, 'update testlinked set ssn=ssn+1')select * from openquery (linked1, 'insert into  testlinked  (ssn) values (1000)')select * from openquery (linked1, 'delete from  testlinked  where ssn=1')

可能會產生下列錯誤訊息:

伺服器: Msg 7357,Level 16,狀態2,第1行無法處理物件「更新 testlinked set ssn = ssn」。 OLE DB 提供者 "SQLOLEDB" 表示該物件沒有資料行。 伺服器: Msg 7357、Level 16、State 2、Line 1 [Microsoft] [ODBC SQL Server 驅動程式] [SQL Server] 無法處理「更新 testlinked set ssn = ssn」物件。 OLE DB 提供者 ' MSDASQL ' 指出該物件沒有欄。

錯誤的實際文字訊息可能會根據 OLE DB 提供者以及執行的操作(更新、插入或刪除)而有所不同,但錯誤號碼永遠是7357。 如果您使用的是 Microsoft SQL Server 2005,您會收到下列錯誤訊息:

伺服器: Msg 7357、Level 16、State 2、Line 1 無法處理「更新 testlinked set ssn = ssn」物件。 連結伺服器 "ServerName" 的 OLE DB 提供者 "SQLOLEDB" 表示該物件沒有欄,或是目前的使用者沒有該物件的許可權。

原因

Openquery 需要傳回結果集,但與 OpenQuery 搭配使用的 UPDATE、DELETE 及 INSERT 語句則不會傳回結果集。

因應措施

您可以透過下列方式來解決此問題:

  1. 使用四個部分的名稱(linked_server_name catalog. object_name)來執行插入、更新或刪除作業。

  2. 如 SQL Server 線上書籍中所述,請參照 OpenQuery 函數作為插入、更新或刪除語句的目標表格,但受 OLE DB 提供者的功能制約。 下列查詢示範與 SQL Server OLE DB 提供者之間的適當用法:

    update openquery(linked1, 'select ssn from testlinked where ssn=2')set ssn=ssn + 1insert openquery(linked1, 'select ssn from testlinked where 1=0') values (1000)delete openquery(linked1, 'select ssn from testlinked where ssn>100')

    注意: 在 INSERT 語句中,使用 1 = 0 謂詞來避免從遠端伺服器中檢索資料,這可能導致效能變慢。 此外,更新及刪除操作也有特殊的索引需求;如需詳細資訊,請參閱「其他資訊」一節。

其他相關資訊

唯一索引需求

SQL Server OLE DB 提供者要求基礎資料表上存在唯一索引,才能進行更新或刪除作業。 如果遠端資料表上不存在唯一索引,當嘗試更新或刪除時,會發生下列錯誤:

伺服器: Msg 7320、Level 16、State 2、Line 1 無法針對 OLE DB provider "SQLOLEDB" 執行查詢。 提供者不支援必要的列查閱介面。 提供者指出與其他屬性或需求發生衝突。 [OLE/DB 提供者傳回訊息:多重步驟 OLE DB 操作產生錯誤。 檢查每個 OLE DB 狀態值(如果有的話)。 尚未完成工作。

這同時適用于 OpenQuery 和四部分具名更新及刪除作業。 您可以在遠端資料表上新增唯一索引來解決此問題。

使用 OpenQuery 進行動態執行

有時候,您可能會想要使用動態查詢來使用 OpenQuery來達到相同的效果,如下列範例所示:

begin tranSET QUOTED_IDENTIFIER OFFSET XACT_ABORT ONdeclare @cmd varchar(2500) declare @cmd1 varchar(2500) declare @var varchar(20) set @var = 'White' declare @var1 varchar(20) set @var1 = 'White1' declare @var2 varchar(20) set @var2 = 'Johnson1'select @cmd = "Update openquery(linked1,'select au_lname, au_fname from pubs.dbo.authorswhere au_lname = ''" + @var + "''' )set au_lname = '" + @var1 + "',au_fname = '" + @var2 + "'"exec ( @cmd )commit transelect * from <servername>.pubs.dbo.authors

需要更多協助?

擴展您的技能
探索訓練
優先取得新功能
加入 Microsoft 測試人員

這項資訊有幫助嗎?

感謝您的意見反應!

感謝您的意見反應! 我們將協助您與我們的其中一個 Office 支援專員連絡以深入了解您的意見。

×