我有以下查询,它将数据从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完成此任务的最佳策略是什么?
答案 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不是一种有效的方法,尽管在某些情况下它可能会起作用。
詹姆斯