SSIS。将SQL Server的结果用作Vertica查询中的where子句

时间:2018-04-04 17:56:04

标签: sql-server ssis vertica

我在SQL Server中有一个视图,它从没有产品描述的表中检测所有产品ID。 在vertica中,我们拥有所有产品ID及其描述。 我的想法是构建一个SSIS包,它可以提取缺少描述的所有Products ID并将其用作Vertica查询中的where子句。

我已经尝试过用户变量但是我失败了。我是SSIS的初学者

这就是我要找的。

SELECT [Product ID], [Product Desc]
FROM VerticaTable
WHERE [Product ID] IN (@Variable?)

变量应该是这样的。

SELECT DISTINCT [Product ID] FROM SQLSerrverViewThatHasMissingDesc

3 个答案:

答案 0 :(得分:3)

基本上你有两种方法可以做到这一点。

首先,我想告诉您SELECT包中的SSIS不会向您显示任何内容,但您可以对查询进行更改,例如将结果插入一张桌子。

  1. 创建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作为连接类型)

    • 使用此方法的缺点是您无法同时查看所有productID,因为这是一个循环过程,除非您希望将每个结果加载到表中。
  2. 如果您希望同时查看所有候选结果,最常见的方法是使用Dynamic SQL,因为查询中的任何位置都不支持变量。

  3. 所以,与您编写的查询相同,但需要一些加法。

    1)首先,创建三个变量,variable1variable2variable3variable1Object类型和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 EnumeratorVariable1,模式为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();