我在服务器 1 上有一个 SSIS 包。它通过 OLEDB 源 sql 命令文本对位于服务器 2 上的 SQL db 执行 SQL 查询。查询是:
SELECT * FROM PRODUCTS
WHERE PRODUCT_NAME IN (?)
这失败了,因为?是标量值而不是表。要解决此问题,有 2 个选项:
- 使用 STRING_SPLIT
-
使用 OLE DB 源 SQL 命令
如果您使用的是 OLE DB 源组件,则可以使用以下 SQL 命令:
DECLARE @String varchar(100) = ?; SELECT * FROM PRODUCTS WHERE PRODUCT_NAME IN ( SELECT LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) 'Value' FROM ( SELECT CAST ('<M>' REPLACE(@String , ',', '</M><M>') '</M>' AS XML) AS Data ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a) )
测验
使用
AdventureWorks2017
数据库,我使用以下查询来搜索存盘在[Person].[Person]
表中的人的信息,而过滤器位于PersonType
列上:DECLARE @String varchar(100) = ?; SELECT * FROM [AdventureWorks2017].[Person].[Person] WHERE PersonType IN ( SELECT LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) 'Value' FROM ( SELECT CAST ('<M>' REPLACE(@String , ',', '</M><M>') '</M>' AS XML) AS Data ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a) )
在 OLE DB 源代码编辑器中,如果我们单击“自变量”按钮,则会识别一个自变量。我将创建一个新变量并将其用作自变量,如下图所示:
变量资料型别应该设定为
String
,并且值设定为列中EM,SC
使用的两个符号PersonType
。现在,如果我们单击OLE DB 源编辑器中的“预览”按钮,准确的资料将被可视化。
uj5u.com热心网友回复:
您可以将字符串加载到自变量物件 @ProductNames 中,然后将其用作源,然后将产品表内部连接到另一个资料流中。
第一个 DF:使用 @stringToParse 作为变量的脚本组件源。在 ProductName 的 DF 中也有输出字符串。
代码:
string prods = Variables.stringToParse.Value; string[] productNames = prods.Split(','); foreach(string p in productNames) { OutputBuffer0.AddRow(); OutputBuffer0.ProductName = p; }
然后将结果加载到映射到@ProductNames 的记录集目标中。
第二个DF:2个来源。
- 产品表
- 你的记录集@ProductNames
做一个合并连接(内部),你就会有你的记录。
0 评论