0

我有以下查询,它将数据从 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

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

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

4

1 回答 1

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 不是一种有效的方法,尽管它在某些情况下可能会起作用。

詹姆士

于 2013-10-08T14:23:33.970 回答