我在SQL Server中有一个视图,它从没有产品描述的表中检测所有产品ID。 在vertica中,我们拥有所有产品ID及其描述。 我的想法是构建一个SSIS包,它可以提取缺少描述的所有Products ID并将其用作Vertica查询中的where子句。
我已经尝试过用户变量但是我失败了。我是SSIS的初学者
这就是我要找的。 p>
SELECT [Product ID], [Product Desc]
FROM VerticaTable
WHERE [Product ID] IN (@Variable?)
变量应该是这样的。
SELECT DISTINCT [Product ID] FROM SQLSerrverViewThatHasMissingDesc
答案 0 :(得分:3)
基本上你有两种方法可以做到这一点。
首先,我想告诉您SELECT
包中的SSIS
不会向您显示任何内容,但您可以对查询进行更改,例如将结果插入一张桌子。
创建Object
类型变量1并使用Foreach Loop Container
迭代该变量1,将每个值分配给另一个变量2(预先创建,也许它是一个String类型变量)。然后在容器中,为Execute SQL task
添加查询:
SELECT [Product ID], [Product Desc]
FROM VerticaTable
WHERE [Product ID] = ?
在参数映射页面中将variable1映射为Index 0
。 (如果您使用OLE DB作为连接类型)
如果您希望同时查看所有候选结果,最常见的方法是使用Dynamic SQL
,因为查询中的任何位置都不支持变量。
所以,与您编写的查询相同,但需要一些加法。
1)首先,创建三个变量,variable1
,variable2
,variable3
,variable1
是Object
类型和variable2
和{ {1}}是variable3
类型。
2)接下来,您需要String
来构建变量。在Foreach Loop Container
中,拖放Foreach Loop Container
。在容器之前,通过Script Task
连接,然后在容器之后连接另一个Execute SQL task
所以物理顺序:执行SQL任务1 - > Foreach循环容器,内部:脚本任务 - >执行SQL任务2
3)打开执行SQL任务1,将Execute SQL task
放入查询中,然后转到SELECT DISTINCT [Product ID] FROM SQLSerrverViewThatHasMissingDesc
页面,指定Result set
4)转到Variable1
,选择Foreach loop Container
,然后选择Foreach ADO Enumerator
为Variable1
,模式为ADO object source variable
,然后转到{{1}页面,选择Rows in the first table
,并默认索引。
5)转到Variable mappings
,打开它,选择Variable2
作为Script task
,在Variable
中选择ReadOnlyVariable
,编辑脚本,粘贴ReadWrite variable
Variable3
6)完成上述步骤后,理想情况下,Main()
的长字符串将由 if (Dts.Variables["User::Variable3"].Value.ToString() == "")
{
Dts.Variables["User::Variable3"].Value = Dts.Variables["User::Variable2"].Value.ToString();
}
else
{
Dts.Variables["User::Variable3"].Value = Dts.Variables["User::Variable2"].Value.ToString() + "," + Dts.Variables["User::Variable2"].Value.ToString();
}
Dts.TaskResult = (int)ScriptResults.Success;
分隔,如Variable3
。您希望获取此字符串的原因是因为,
稍后会在A,B,C,D,E
中使用Variable3
作为Execute SQL task
7)最后一步,在Dynamic SQL
中,使用以下查询:
Execute SQL Task 2
在参数映射中,选择DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'SELECT [Product ID], [Product Desc]
FROM VerticaTable
WHERE [Product ID] IN (''' + ? + ''')'
,索引为0.
8)执行包。
但它不会向您显示任何内容,但如果您尝试在Vareiable3
中模拟动态流程,则会看到结果。
答案 1 :(得分:1)
LONG的答案很好。我将添加一些小调整来获取你的IN子句。请接受他的回答,如果你觉得这有用,只需要投票。
使用执行SQL任务直接使用SQL Server中的stuff函数获取IN子句,并将结果集直接设置为字符串变量中的单行。
coalesce只处理null(无结果)并将变量设置为空字符串。
declare @t table (ProdID int)
insert into @t
values(1),(1),(2),(3)
select coalesce(
stuff(
(select ','+cast(ProdID as varchar(5))
from @t
group by ProdID
for XML path(''))
,1,1,'')
,'') as delimProdIds
结果:
delimProdIds
1,2,3
只需将@t更改为您的视图
即可在控制流程中(在此exec SQL步骤之后)放置一个表达式,即变量!=''(空字符串)如果是,则它将在此处结束该过程。
答案 2 :(得分:0)
Long的用于创建变量的脚本有一个小错误:
Dts.Variables["User::Variable3"].Value =
Dts.Variables["User::Variable2"].Value.ToString() + "," +
Dts.Variables["User::Variable2"].Value.ToString();
当Variable3
有值时,它们每次都被Variable2
覆盖。可能应该是:
Dts.Variables["User::Variable3"].Value =
Dts.Variables["User::Variable3"].Value.ToString() + "," +
Dts.Variables["User::Variable2"].Value.ToString();