新问题,但多年来一直在使用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服务器。
答案 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。