0

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

4

3 回答 3

1

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

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

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

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

于 2020-11-12T10:12:19.647 回答
0

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

  • 添加一个 SSIS 布尔变量。这IsColumnNull在以下示例中。接下来在字段中添加一个带有IsColumnNull变量的 C# 脚本任务ReadWriteVariables,以及(可选)一个保存文件路径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;
            }
        }
于 2020-11-16T20:30:10.503 回答
0

就个人而言,如果我必须执行此任务,我将使用脚本任务来完成所有任务:

  1. 加载到数据表中
  2. 使用 linq 检查列以确定目的地.Where(x => x[4]!=null).Count()
  3. 通过批量复制加载到目的地
于 2020-11-13T14:50:10.630 回答