我正在开发一个 SSIS 包,其中有一个包含 5 列的文本文件。我需要检查第 5 列的所有行是否都是 NULL 值。如果第 5 列中的所有行均为 NULL,则所有数据都应用于无效文件表。如果第 5 列中的任何行具有非 NULL 值,则所有数据都应转到有效表。
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
就个人而言,如果我必须执行此任务,我将使用脚本任务来完成所有任务:
- 加载到数据表中
- 使用 linq 检查列以确定目的地
.Where(x => x[4]!=null).Count()
- 通过批量复制加载到目的地
于 2020-11-13T14:50:10.630 回答