Sql-Server
使用 OPENQUERY 執行腳本
我有一個 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 RPC
以false
使用以下方法在表中擷取結果:INSERT <table> (columns) EXECUTE (@Script) AT <linked server>;
請注意,這可能效率低得多,
EXECUTE
因為INSERT
. 如果結果很大,這可能會出現問題。