SSIS中的条件拆分-SQL

问题描述

我对sql数据库很陌生,但是我试图在我的平面文件源和OLE DB数据库间的数据流中添加条件拆分,以排除包含某些特殊字符(例如ø和¿和¡)的记录[标题]列。这些在创建表时引起错误,因此我希望将这些记录从表中拆分出来。如何为此创建条件拆分?

作为奖励:是否有一种方法只能在条件拆分中过滤包含0-9的数字和a-zA-Z的字母的行,以便自动过滤掉所有带有“特殊”符号的行? / p>

解决方法

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

我该怎么做?

我始终主张人们在数据流中添加新列来处理这些问题。这是当您认为应该已处理但没有处理的条件出现时,您必须进行调试的唯一方法。

是否创建名为IsTitleOnlyAlphaNumericIsTitleInternational的列完全取决于您。一般的编程规则是您选择常见/可能的情况。由于ASCII世界最多为127个字符,扩展ASCII为255个字符,所以我主张使用前者。否则,由于下一个文件中有杂音或刺音,您将要播放打地鼠。

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

添加一个新的类型为boolean IsTitleOnlyAlphaNumeric的列,并从check alphanumeric characters in string in c#填充正则表达式

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

Row.IsTitleOnlyAlphaNumeric = isAlphaNumeric(Row.Title);

随着行的通过,将对每个行进行评估,您将看到它是否符合条件。根据您的数据,在调用该方法之前,可能需要检查NULL。

我不应该这样做

* 可以滥用REPLACE函数的日光,并通过执行类似创建名为StrippedTitle的新列的操作来测试表达式的允许长度,我们将用空字符串替换所有允许的字符。如果修剪后的最终字符串的长度不为零,则说明其中存在一些问题。

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

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

这将是一个新列。因此,添加第二个“派生列”组件以计算其是否为空-再次易于调试。 IsTitleOnlyAlphaNumeric

LEN(RTRIM(StrippedTitle)) == 0

这很糟糕,但是我后来在人们澄清“我不能使用脚本”的地方回答的问题绝对不是零。