虽然这看起来像是一个基本问题,但我一直在试图找到一个有效的解决方案。
我在服务器上有一个值的查找表,我从中读取并使用C#Script任务汇编成一个字符串。我将这个字符串写入一个变量,我希望在我的数据流中作为我的WHERE参数传入ADO.NET数据源(来自我只有读取权限的其他服务器)的大型SQL查询中。例如,这个字符串就像是
('Frank', 'John', 'Markus', 'Tom')
我会将其作为我的WHERE子句追加。 我无法直接从变量中读取ADO.NET数据源而且我不能使用'Expression'属性来设置我的SQL,因为我的SQL查询超过4000个字符。我可以使用一个执行SQL任务来运行我的查询,将结果加载到一个记录集,我假设,然后循环记录集,但这是非常低效的。
最好的方法是什么?我的最终目标是将这些结果放在第一台服务器上的表中。
答案 0 :(得分:2)
您可以尝试将脚本组件设置为源 - 脚本中的变量和字符串可以超过4000个字符,这样您就可以在查询中使用。
设置与本文类似的组件:http://beyondrelational.com/modules/2/blogs/106/posts/11119/script-componentsource-part1.aspx
在本文中,您将了解如何使用ExecuteReader
获取数据并将其输出到脚本组件的输出:http://beyondrelational.com/modules/2/blogs/106/posts/11124/ssis-script-component-as-source-adonet.aspx在此示例中,您将获得如何正确获取连接的说明:http://www.toadworld.com/platforms/sql-server/b/weblog/archive/2011/05/30/use-connections-properly-in-an-ssis-script-task
通过加入这些信息,你应该能够编写源脚本组件,它可以使用任意长度的动态构造查询来获取数据。
祝你好运:)答案 1 :(得分:0)
您可以执行简单的select
语句来返回包含('Frank', 'John', 'Markus', 'Tom')
的值列表。所以你的select
会返回:
Name
----------
Frank
John
Markus
Tom
然后,在SSIS中,使用Merge Join Component
(将充当INNER JOIN
)而不是主查询中的where子句。
这是达到你想要的最干净的方式。