将多个值传递给链接服务器连接字符串中的变量

时间:2013-10-08 13:51:40

标签: sql sql-server variables connection-string dynamic-sql

我有以下查询,它将数据从Oracle DB提取到SQL Server 2005中:

SELECT *
FROM (
    SELECT * 
    FROM OPENQUERY(LINKEDSERVERNAME, 'SELECT FOO, BAR, FROM TABLE
    WHERE ID IN(' + @IDs + '
    ')) AS TMP
WHERE SOME_ID IN
    (SELECT DISTINCT ID
    FROM LOCALTABLE);

然而,运行时非常长,因为来自链接服务器的查询会导致大量行。我只对少数这些行感兴趣,但限制我的查询的标准保存在目标数据库中。

通过SO上的另一篇文章,我发现我可能会在动态sql中使用一个看起来像这样的变量:

DECLARE @IDs AS NVARCHAR(100);

SET @IDs = (SELECT ID FROM LOCALTABLE)

DECLARE @sql AS NVARCHAR(3000);

SET @sql = 'SELECT * FROM OPENQUERY(LINKEDSERVERNAME, ''SELECT FOO, BAR, FROM TABLE
WHERE ID IN(' + @IDs + '))'

EXEC sp_executesql @sql

但是,我显然不能为变量分配多个值,因此结果集只包含放置在@ID中的最终ID的结果。

为本地表中的所有不同ID完成此任务的最佳策略是什么?

1 个答案:

答案 0 :(得分:1)

Anup Shah已经指出他的评论中有什么问题。您的SELECT赋值只会将一个值放入变量中。您需要一种方法将表结果转换为IN语句的CSV样式。 Pinal Dave有一个很好的帖子,它显示了使用XML PATH执行此操作的众所周知的技术。

http://blog.sqlauthority.com/2009/11/25/sql-server-comma-separated-values-csv-from-table-column/

值得注意的是SELECT @var = @var + var FROM table不是一种有效的方法,尽管在某些情况下它可能会起作用。

詹姆斯