将变量列表从一个OpenQuery传递到另一个OpenQuery

时间:2014-02-24 21:28:29

标签: sql-server ssms openquery

新问题,但多年来一直在使用Stackoverflow。

我有两个不相互通信的单独链接的服务器。我需要从一个服务器获取一个变量列表到SQL,然后将该变量列表传递给第二个OpenQuery,其最终目标是将来自该服务器的数据导入SQL。我已经能够传递单键入变量。但是当我尝试使用stringed 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。这两个链接的服务器是无法远程连接的Oracle服务器。

1 个答案:

答案 0 :(得分:0)

通过将一个openquery嵌套在另一个openquery中,您告诉server2将openquery运行到server1,您已声明不能这样做。上面也有错误,因为你将@string嵌套到@sql中,但是你正在执行@string,而不是@sql。

如果您期望获得相对较小的回报,我建议使用临时表来保存来自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的值转换为逗号分隔的字符串,并将其嵌入到变量中的第二个openquery中,并使用sp_executesql执行它。将列转换为以逗号分隔的列表时,这是一个很棒的SO post