如何检查SSIS中一列的所有行是否均为NULL?

问题描述

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

解决方法

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

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

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

将答案输入变量后,如果结果大于0,则可以使用precedence constraints触发数据流副本[登台至活动状态],如果结果为0,则可以使用[登台至故障状态]

,

如果需要亲自执行此任务,我将使用脚本任务来完成所有操作:

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

您可以使用OleDbDataAdapter使用C#检查文件是否为空,然后搜索文件,然后使用SSIS优先约束确定在何处加载文件。本示例使用不带列名的CSV文件。如果列中确实有名称,请添加以下注释中指出的替换代码。您还将需要列出using语句。

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

enter image description here

具有空值的行的优先约束:

enter image description here

无空行的优先约束:

enter image description here

脚本任务示例:

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...