拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 当数据库兼容级别设定为SQLServer2008时,如何在SSISOLEDB源SQL命令中使用STRING_SPLIT?

当数据库兼容级别设定为SQLServer2008时,如何在SSISOLEDB源SQL命令中使用STRING_SPLIT?

白鹭 - 2022-01-23 2184 0 0

我在服务器 1 上有一个 SSIS 包。它通过 OLEDB 源 sql 命令文本对位于服务器 2 上的 SQL db 执行 SQL 查询。查询是:

SELECT * FROM PRODUCTS
WHERE PRODUCT_NAME IN (?)

这失败了,因为?是标量值而不是表。要解决此问题,有 2 个选项:

  1. 使用 STRING_SPLIT
  2. 当数据库兼容级别设定为 SQL Server 2008 时,如何在 SSIS OLE DB 源 SQL 命令中使用 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)
    )
    

    当数据库兼容级别设定为 SQL Server 2008 时,如何在 SSIS OLE DB 源 SQL 命令中使用 STRING_SPLIT?

    在 OLE DB 源代码编辑器中,如果我们单击“自变量”按钮,则会识别一个自变量。我将创建一个新变量并将其用作自变量,如下图所示:

    当数据库兼容级别设定为 SQL Server 2008 时,如何在 SSIS OLE DB 源 SQL 命令中使用 STRING_SPLIT?

    变量资料型别应该设定为String,并且值设定为列中EM,SC使用的两个符号PersonType

    当数据库兼容级别设定为 SQL Server 2008 时,如何在 SSIS OLE DB 源 SQL 命令中使用 STRING_SPLIT?

    现在,如果我们单击OLE DB 源编辑器中的预览”按钮,准确的资料将被可视化。

    当数据库兼容级别设定为 SQL Server 2008 时,如何在 SSIS OLE DB 源 SQL 命令中使用 STRING_SPLIT?

    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个来源。

    1. 产品表
    2. 你的记录集@ProductNames

    做一个合并连接(内部),你就会有你的记录。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *