如何在SSIS中用SQL Server结果作为Vertica查询的WHERE条件
用SSIS实现从Vertica补全缺失描述的Product ID
嘿,作为SSIS新手,这种动态传递筛选条件的需求确实容易卡壳,我来一步步带你完成这个流程:
1. 先搞定SSIS变量
右键打开“变量”面板,新建两个核心变量:
@MissingProductIDs:类型选字符串,用来存从SQL Server视图捞到的、缺描述的Product ID列表(格式得是'P001','P002','P003'这种带单引号的字符串型ID,要是数字ID就写成101,102,103)@VerticaQuery:类型也选字符串,用来存最终要跑的Vertica动态查询语句
2. 从SQL Server视图提取缺失的Product ID
给控制流加一个Execute SQL Task,配置成这样:
- 连接管理器:选你的SQL Server连接
- SQL语句:直接查视图并把ID拼成我们要的格式,SQL Server 2017及以上版本用
STRING_AGG就行:SELECT STRING_AGG([Product ID], ''',''') AS MissingIDs FROM YourSQLServerView要是用的旧版SQL Server,就换
FOR XML PATH来拼接:SELECT STUFF((SELECT ''',''' + CAST([Product ID] AS VARCHAR(50)) FROM YourSQLServerView FOR XML PATH('')), 1, 2, '') + '''' AS MissingIDs - ResultSet选Single Row,然后把查询出来的
MissingIDs列映射到@MissingProductIDs变量上
3. 拼出Vertica的动态查询语句
去@VerticaQuery的表达式里设置内容:
- 如果Product ID是字符串类型:
"SELECT [Product ID], [Product Desc] FROM VerticaTable WHERE [Product ID] IN (" + @[User::MissingProductIDs] + ")" - 如果是数字类型,不用加单引号,表达式改成:
"SELECT [Product ID], [Product Desc] FROM VerticaTable WHERE [Product ID] IN (" + @[User::MissingProductIDs] + ")"
4. 执行Vertica查询拿结果
再给控制流加一个Execute SQL Task,配置如下:
- 连接管理器:选你的Vertica连接(记得先装Vertica的ODBC驱动,把连接配置好)
- SQLSourceType选Variable,然后选中我们刚拼好的
@VerticaQuery - 要是需要把结果存去别的表或者数据集,按需配置ResultSet映射就行
几个要注意的坑
- 数据类型要对齐:SQL Server视图里的
Product ID和Vertica表的Product ID类型必须一致,不然查不到数据 - 空值要处理:如果SQL Server视图里没有缺描述的ID,
@MissingProductIDs会是空的,这时Vertica查询会报错,建议在第一个Execute SQL Task后面加个Conditional Split,判断变量是否为空,为空就跳过Vertica查询步骤 - 变量作用域别搞错:变量的作用域要覆盖到所有用到它的任务,一般设成包级就没问题
内容的提问来源于stack exchange,提问作者Solrac
相关产品推荐
相关产品推荐

