我在SQL Server中有一个视图,该视图从没有产品描述的表中检测所有产品ID。在vertica中,我们具有所有产品ID及其说明。我的想法是构建一个SSIS包,该包可以提取缺少描述的所有产品ID,并将其用作Vertica查询中的where子句。
我已经尝试使用用户变量,但是失败了。我是SSIS的初学者
这就是我想要的。
SELECT [Product ID], [Product Desc]
FROM VerticaTable
WHERE [Product ID] IN (@Variable?)
变量应该像这样。
SELECT DISTINCT [Product ID] FROM SQLSerrverViewThatHasMissingDesc
基本上,您有两种方法可以做到这一点。
首先,我想让您知道SELECT
包中的SSIS
不会显示任何内容,但是您可以对查询进行更改,例如将结果插入表中。
创建Object
类型的变量1并使用Foreach Loop Container
迭代该变量1,将每个值分配给另一个变量2(预先创建,也许是String类型的变量)。然后在容器中,输入Execute SQL task
和以下查询:
SELECT [Product ID], [Product Desc]
FROM VerticaTable
WHERE [Product ID] = ?
在参数映射页面中将变量1映射为Index 0
。 (如果您使用OLE DB作为连接类型)
如果您希望同时查看所有候选结果,最常见的方法是使用Dynamic SQL
,因为查询中的任何位置均不支持变量。
因此,与您编写的查询相同,但需要一些附加功能。
1]首先,创建三个变量,variable1
,variable2
,variable3
,variable1
是Object
类型,variable2
和variable3
是String
类型。
2)接下来,您需要Foreach Loop Container
来建立变量。在Foreach Loop Container
中,拖放Script Task
。在容器之前,通过Execute SQL task
连接,在容器之后,连接另一个Execute SQL task
物理订单:执行SQL任务1-> Foreach循环容器,内部:脚本任务->执行SQL任务2
3)打开执行SQL任务1,在查询中放入SELECT DISTINCT [Product ID] FROM SQLSerrverViewThatHasMissingDesc
,然后转到Result set
页面,分配Variable1
4)移至Foreach loop Container
,选择Foreach ADO Enumerator
,然后选择Variable1
作为ADO object source variable
,模式为Rows in the first table
,然后转到Variable mappings
页面,选择Variable2
,并默认设置索引。
5)转到Script task
,将其打开,选择Variable
作为ReadOnlyVariable
,在ReadWrite variable
中,选择Variable3
,编辑脚本,将以下代码粘贴到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;
6)在完成上述步骤之后,理想情况下,您的Variable3
将有一个由,
分隔的长字符串,例如A,B,C,D,E
。您要获取此字符串的原因是因为此Variable3
稍后将在Execute SQL task
中用作Dynamic SQL
7)这是最后一步,在Execute SQL Task 2
中,使用以下查询:
DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'SELECT [Product ID], [Product Desc]
FROM VerticaTable
WHERE [Product ID] IN (''' + ? + ''')'
在参数映射中,选择Vareiable3
,索引为0。
8)执行程序包。
但是它不会显示任何内容,但是如果您尝试在SSMS
中模拟动态过程,则会看到结果。
LONG的答案很好。我将进行一些调整以获取您的IN子句。请接受他的回答,如果您认为对您有帮助,请立即投票。
使用执行SQL任务直接使用SQL Server中的填充函数直接获取IN子句,并将结果集直接设置为字符串变量的一行。
合并仅处理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步骤之后,放置一个表达式,该表达式表示变量!=''(空字符串),如果正确,它将在此处结束该过程。
Long的脚本创建变量有一个小错误。...Dts.Variables [“ User :: Variable3”]。Value = Dts.Variables [“ User :: Variable2”]。Value.ToString()+“,” + Dts.Variables [“ User :: Variable2”]。Value。 ToString();}当变量3具有值时,它们每次都被变量2覆盖。应该是Dts.Variables [“ User :: Variable3”]。Value = Dts.Variables [“ User :: Variable3”]。Value.ToString()+“,” + Dts.Variables [“ User :: Variable2”]。Value。 ToString();}