0

質問するのは初めてですが、Stackoverflow を何年も使用しています。

互いに通信しない 2 つの個別にリンクされたサーバーがあります。1 つのサーバーから SQL に変数のリストを取得し、その変数のリストを 2 番目の OpenQuery に渡して、そのサーバーから SQL にデータを取り込む必要があります。単一キーの変数を渡すことができました。しかし、文字列化された OpenQuery または単に文字列化されたクエリを使用しようとすると、エラーが返されます。誰かが私を正しい方向に向けることができますか?

現在のクエリ:

    DECLARE @string VARCHAR(MAX)
,       @SQL NVARCHAR(MAX);

SET @string = 
'
Select 
    col1    
from 
    OpenQuery(server1, ''Select col1 from table1 where col2 = '''' a ''''
    ';
SET @SQL = 'SELECT * FROM OPENQUERY(Server2, ''SELECT * FROM table2 WHERE col1 = ''''' + @string  + ''''' '')';


EXEC sp_executesql @string;

あなたが与えることができるどんな援助も大歓迎です。

2008 SQL サーバーで実行されている SSMS 2012 を使用しています。リンクされた 2 つのサーバーは、リモート接続できない Oracle サーバーです。

4

1 に答える 1

0

あるopenqueryを別のopenqueryにネストすることにより、server2にserver1に対してopenqueryを実行するように指示しますが、これは実行できないと述べています。@string を @sql にネストしているが、@sql ではなく @string を実行しているという点で、上記のエラーもあります。

比較的小さなリターンを期待している場合は、一時テーブルを使用して server1 からのデータを保持し、それを使用して server2 からのリターンをフィルタリングすることをお勧めします。

IF OBJECT_ID('TEMPDB..#TMP') IS NOT NULL
    DROP TABLE #TMP

SELECT COL1 
INTO #TMP 
FROM OPENQUERY(SERVER1, 'SELECT COL1 FROM TABLE1 WHERE COL2 = ''A''')

SELECT * 
FROM OPENQUERY(SERVER2, 'SELECT * FROM TABLE2')
WHERE COL1 IN (SELECT COL1 FROM #TMP)

フォローアップ編集として、server2 からの戻り値が大きい場合は、ローカル サーバーに戻る前にフィルタリングを検討して、大量のデータをネットワーク経由で転送しないようにする必要があります。この場合、#tmp の値をカンマ区切りの文字列に変換し、それを変数の 2 番目の openquery にネストして、sp_executesql で実行します。これは、列をコンマ区切りリストに変換することに関する優れたSO 投稿です。

于 2014-02-25T04:04:43.180 に答える