【问题标题】:How do I check whether all the rows for a column are NULL in SSIS?如何在 SSIS 中检查列的所有行是否为 NULL?
【发布时间】:2020-11-17 04:30:10
【问题描述】:

我正在开发一个 SSIS 包,其中有一个包含 5 列的文本文件。我需要检查第 5 列的所有行是否都是 NULL 值。 如果第 5 列中的所有行均为 NULL,则所有数据都应用于无效文件表。 如果第 5 列中的任何行具有非 NULL 值,则所有数据都应转到有效表中。

【问题讨论】:

    标签: ssis ssis-2017


    【解决方案1】:

    您需要先读取整个文件,然后才能决定将其写入何处,因此请引入第三个表,您可以先在其中暂存数据

    下一部分将构建检查登台表中所有 NULL 的逻辑。如果所有记录都为 NULL,则下面的查询将返回 0,如果任何记录有值,则返回大于 0

    SELECT COUNT(*) FROM dbo.StagingTable ST WHERE ST.Column5 IS NOT NULL
    

    将答案输入变量后,如果结果大于 0,您可以使用 precedence constraints 触发数据流副本 [staging to active],如果结果为 0,则 [staging to faulty]

    【讨论】:

      【解决方案2】:

      就个人而言,如果我必须执行此任务,我会使用脚本任务来完成这一切:

      1. 加载到数据表中
      2. 使用 linq 检查列以确定目标.Where(x => x[4]!=null).Count()
      3. 通过批量复制加载到目标

      【讨论】:

        【解决方案3】:

        您可以使用 C# 使用 OleDbDataAdapter 检查文件是否为空并搜索文件,然后使用 SSIS 优先约束确定加载文件的位置。此示例使用没有列名的 CSV 文件。如果列确实有名称,请添加下面 cmets 中注明的替换代码。您还需要列出的using 语句。

        • 添加一个 SSIS 布尔变量。这是以下示例中的IsColumnNull。接下来在ReadWriteVariables 字段中添加一个带有IsColumnNull 变量的C# 脚本任务,以及(可选)一个保存文件路径ReadOnlyVariables 窗格的变量。
        • 接下来设置优先约束以检查真条件(有空行)或假条件(没有空记录)。由于IsColumnNull 变量是布尔值,因此仅使用变量本身作为表达式来检查所有空行,但添加! 用于非空行,即!@[User::IsColumnNull]
        • 将每个目标表的相应数据流任务连接到相应的优先约束。例如,在 Precedence Constraint 检查IsColumnNull 变量中的真值之后,添加“无效文件表”作为目标的数据流任务。

        空值行的优先约束:

        无空行的优先约束:

        脚本任务示例:

        using System;
        using System.Data;
        using System.IO;
        using System.Data.OleDb;
        using System.Linq;
        using Microsoft.SqlServer.Dts.Runtime;
        using System.Windows.Forms;
        
        
                string fullFilePath = Dts.Variables["User::FilePath"].Value.ToString();
                string fileName = Path.GetFileName(fullFilePath);
                string filePath = Path.GetDirectoryName(fullFilePath);
        
                string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath
                    + ";Extended Properties=\"text;HDR=No;FMT=Delimited\";";
        
                //add filter for NOT NULL on given column to only return non-nulls
                string sql = "SELECT F2 FROM " + fileName + " WHERE F2 IS NOT NULL";
        
        
                //if file has column names replce "connStr" and "sql" as shown below
                /*
                string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath
                    + ";Extended Properties=\"text;HDR=Yes;FMT=Delimited\";";
        
                string sql = "SELECT ID FROM " + fileName + " WHERE ID IS NOT NULL";
                */
        
                using (OleDbDataAdapter oleAdpt = new OleDbDataAdapter(sql, connStr))
                {
                    DataTable dt = new DataTable();
                    oleAdpt.Fill(dt);
        
                    //if emtpy set IsColumnNull SSIS variable to true
                    if (dt.Select().Count() < 1)
                    {
                        Dts.Variables["User::IsColumnNull"].Value = true;
                    }
                    else
                    {
                        Dts.Variables["User::IsColumnNull"].Value = false;
                    }
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-18
          • 1970-01-01
          • 1970-01-01
          • 2013-11-05
          • 2018-02-22
          • 1970-01-01
          • 1970-01-01
          • 2017-01-10
          相关资源
          最近更新 更多