Sql-Server

使用 OPENQUERY 執行腳本

  • May 23, 2017

我有一個 SQL Server 2008 實例,我想用它從 Oracle 伺服器導入數據。

我已經設置了一個連結伺服器,它在執行簡單查詢(如SELECT * FROM table. 但是,如果我聲明一個變數或循環遍歷表中的行或 中的任何其他內容,則會OPENQUERY出現錯誤。

是否可以使用 來做到這一點OPENQUERY?我需要額外的權限嗎?

您可能會看到如下錯誤:

Msg 7357, Level 16, State 1, Line xx
Cannot process the object "<query text>".
The OLE DB provider "<provider>" for linked server "<server>" indicates that either 
the object has no columns or the current user does not have permissions on that object.

當 SQL Server 嘗試發現OPENQUERY語句返回的數據的形狀時,就會發生這種情況。這裡有許多引人入勝的細節,但結果是OPENQUERY最好只使用一個SELECT語句,就像線上圖書中的所有範例一樣。

可以使用 執行其他操作OPENQUERY,包括執行遠端儲存過程,但該過程應該只返回一個結果集,並且在此之前不應該有任何事情SELECT可能會破壞 SQL Server 檢查結果集形狀的方式。

另一種方法是使用EXECUTE ... AT,例如:

DECLARE @Script nvarchar(max) =
   N'
   <some amazing script>
   ';

EXECUTE (@Script) AT <linked_server_name>

有關完整的語法和選項,請參閱聯機叢書。

您可能需要設置連結伺服器的 Server Options 屬性Enable promotion of distributed transactions for RPCfalse使用以下方法在表中擷取結果:

INSERT <table> (columns)
EXECUTE (@Script) AT <linked server>;

請注意,這可能效率低得多,EXECUTE因為INSERT. 如果結果很大,這可能會出現問題。

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