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

问题描述 投票:1回答:3

我在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
sql-server ssis vertica
3个回答
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] = ?
    

    在参数映射页面中将变量1映射为Index 0。 (如果您使用OLE DB作为连接类型)

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

因此,与您编写的查询相同,但需要一些附加功能。

1]首先,创建三个变量,variable1variable2variable3variable1Object类型,variable2variable3String类型。

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中模拟动态过程,则会看到结果。


1
投票

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步骤之后,放置一个表达式,该表达式表示变量!=''(空字符串),如果正确,它将在此处结束该过程。


0
投票

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();}

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.