0

我对 SQL 数据库很陌生,但我正在尝试在我的平面文件源和 OLE DB 数据库之间的数据流中添加条件拆分,以排除包含一些特殊字符的记录,例如 [标题上的 ø 和 ¿ 和 ¡ ] 柱子。这些在创建表时会导致错误,因此我希望将这些记录从我的表中拆分出来。如何为此创建条件拆分?

作为奖励:有没有办法仅在条件拆分中过滤包含 0-9 数字和 a-zA-Z 字母的行,以便自动过滤掉所有带有“特殊”符号的行?

4

1 回答 1

0

条件拆分通过确定条件是真还是假来起作用。因此,如果您可以编写一个评估结果为真或假的规则,并且您可以使用多个规则来解决各种业务需求,那么您可以正确地将行分流到不同的路径中。

我怎么做?

我一直主张人们在他们的数据流中添加新列来处理这些东西。当出现您认为应该处理但没有处理的情况时,这是您必须调试的唯一方法。

是否创建一个名为IsTitleOnlyAlphaNumeric或的列IsTitleInternational完全取决于您。一般编程规则是您选择常见/可能的情况。由于 ASCII 宇宙最多 127 个字符,扩展 ASCII 为 255 个字符,我提倡前者。否则,您将玩 whack-a-mole,因为下一个文件中有 umlats 或刺。

通常,我们会通过派生列转换添加一个新列,这意味着您正在使用 SSIS 表达式语言。但是,在这种情况下,表达式无法优雅地*识别字符串是否良好。相反,您需要使用 .NET 库来完成这项繁重的工作。这就是脚本组件,您将让它在转换模式下运行(默认)。

添加一个 boolean IsTitleOnlyAlphaNumeric 类型的新列,并在 c# 中从检查字符串中的字母数字字符中删除正则表达式

OnRowProcessed 的相关位(名称近似)看起来像

Row.IsTitleOnlyAlphaNumeric = isAlphaNumeric(Row.Title);

随着行的流动,将对每一行进行评估,您将看到它是否符合标准。根据您的数据,您可能需要在调用该方法之前检查 NULL。

我怎么不应该那样做

*可以滥用 REPLACE 函数的限制,并通过创建一个名为 StrippedTitle 的新列来测试表达式的允许长度,我们将用空字符串替换所有允许的字符。如果修剪后的最终字符串的长度不为零,那么那里有一些不好的东西。

REPLACE(REPLACE(REPLACE([Title], "A", ""), "B", ""), "C", "") ..., "a", ""), "b", "") ..., "9", "")

其中 ... 表示您已继续该模式。是的,您必须替换大小写字符。ASCIITable.com 或类似网站将成为您的朋友。

那将是一个新的专栏。所以添加第二个 Derived Column 组件来计算它是否为空 - 再次,更易于调试。IsTitleOnlyAlphaNumeric

LEN(RTRIM(StrippedTitle)) == 0

可怕的方法,但我回答的问题数量,人们后来澄清“我不能使用脚本”显然是非零的。

于 2020-10-01T20:46:59.973 回答