0

刚开始提问,但多年来一直在使用 Stackoverflow。

我有两个单独链接的服务器,它们彼此不说话。我需要从一台服务器获取变量列表到 SQL,然后将该变量列表传递到第二个 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。两个链接的服务器是无法远程连接的 Oracle 服务器。

4

1 回答 1

0

通过将一个 openquery 嵌套在另一个中,您是在告诉 server2 对 server1 运行一个 openquery,您已声明不能这样做。上面也有错误,因为您将@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 帖子。

于 2014-02-25T04:04:43.180 回答