使用SSIS 2008 R2检索两个星号之间的字符串中的值

时间:2018-09-18 13:09:21

标签: ssis

我在其他字符数据中间有一个带有2个星号的字段。我需要检索星号之间的值。例如,我有 DOE*JOHN*L,我需要JOHN

我写了以下内容:

SUBSTRING(TRIM(EMPLOYE_NAME),FINDSTRING(TRIM(EMPLOYE_NAME),"*",1) + 1, (FINDSTRING(TRIM(EMPLOYE_NAME),"*",2) - FINDSTRING(TRIM(EMPLOYE_NAME),"*",1) - 2))

当我尝试运行它时,我收到一条DTS_E_INDUCEDTRANSFORMFAILUREONERROR消息,但它失败了。

如果我最后删除-2,则可以使用,但是我还有2个额外的字符。因此,使用上面的示例,我将得到JOHN*L

我已经在SSIS包的派生列中找到了它。这是将固定长度的文件导入SQL Server的过程的一部分。

有什么想法可以使这项工作成功吗?

2 个答案:

答案 0 :(得分:0)

如果您知道您一直想要第一个星号和第二个星号之间的数据,那么我将使用脚本组件和Split()

    string[] strs = Row.str.ToString().Split('*');

    Row.BetweenStars = strs[1]; //Note Split is 0 based and 1 is the second value in the array

确保将str(列的我的名字)添加为只读输入。

将betweenStars添加为数据类型字符串长度为255的输出。

编辑:

更仔细地查看您的数据,我认为您的数据实际上可能是这样的:

姓[星]名[星]中

在这种情况下,您可以使用split设置全部3个。

LastName = strs[0];
FirstName = strs[1];
Middle = strs[2];

在评论1星或2星后编辑:

    string[] strs = Row.str.ToString().Split('*');

    if (strs.Length == 2)
    {
        //This is where first name and last name only exist
        Row.LastName = strs[0];
        Row.FirstName = strs[1];
        Row.Middle_IsNull = true;
    }
    else 
    {
        //This is where all 3 exist
        Row.LastName = strs[0];
        Row.FirstName = strs[1];
        Row.Middle = strs[2];
    }

答案 1 :(得分:0)

您可以在SQL中使用CHARINDEX而不是FINDSTRING来做到这一点:

SUBSTRING(EMPLOYE_NAME, CHARINDEX('*',EMPLOYE_NAME) + 1, CHARINDEX('*',EMPLOYE_NAME,CHARINDEX('*',EMPLOYE_NAME)))

我用'DOE*JOHN*L''DOE*JOHN'进行了测试,都返回了JOHN

编辑:

创建了关于添加条件拆分的冗长文章之后,我发现了原始Derived Column表达式的问题。我能够使用以下表达式来处理带有1个空格,1个星号或2个星号的名称。确保表达式字符串中没有换行符或回车符。

LEN(EMPLOYE_NAME) - LEN(REPLACE(EMPLOYE_NAME," ","")) == 1 ? (SUBSTRING(TRIM(EMPLOYE_NAME),FINDSTRING(TRIM(EMPLOYE_NAME)," ",1) + 1,LEN(EMPLOYE_NAME)) ): (FINDSTRING(TRIM(EMPLOYE_NAME),"*",2) > 0? (SUBSTRING(TRIM(EMPLOYE_NAME),FINDSTRING(TRIM(EMPLOYE_NAME),"*",1) + 1,(FINDSTRING(TRIM(EMPLOYE_NAME),"*",2) - FINDSTRING(TRIM(EMPLOYE_NAME),"*",1)) - 1)): (SUBSTRING(TRIM(EMPLOYE_NAME),FINDSTRING(TRIM(EMPLOYE_NAME),"*",1) + 1,(LEN(EMPLOYE_NAME) - FINDSTRING(TRIM(EMPLOYE_NAME),"*",1)))))