【问题标题】:SQL script to SSIS expressionSQL 脚本到 SSIS 表达式
【发布时间】:2017-12-22 03:22:43
【问题描述】:

我有下面的 T-SQL 查询行,我正在尝试将其转换为 Visual Studio SSIS 表达式到派生列任务中。

所以tableA 只有[Work item /Submission no#] 列,但是当执行以下情况时,我需要将它们分成两列,如表B 中的SubmissionCommonSubmissionNumber

CASE 
    WHEN ISNUMERIC(SUBSTRING([Work item /Submission no#], 4, 2)) = 1
       THEN LEFT([Work item /Submission no#], 15)
       ELSE LEFT([Work item /Submission no#], 16)
END AS SubmissionCommon,
[Work item /Submission no#] AS SubmissionNumber

【问题讨论】:

    标签: sql sql-server ssis expression etl


    【解决方案1】:

    解决方案

    我会建议你先添加一个派生列(可以命名为IsNumeric,表达式如下:

    (DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) == (DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) ? 1 : 0
    

    然后在派生列转换编辑器窗口底部附近,单击配置错误输出。你需要告诉 SSIS Ignore failure on Error

    使用以下表达式添加另一个派生列连接到第一个列

    REPLACENULL([IsNumeric],0) == 1 ? LEFT([Work item /Submission no#], 15) : LEFT([Work item /Submission no#], 16)
    

    因为第一个可能会抛出错误

    有关详细信息,请阅读这篇文章:

    更新 1 - 屏幕截图

    根据你的cmets,我会提供一些截图

    数据流概览

    第一个派生列

    第一个派生列错误输出配置

    第二个派生列

    【讨论】:

    • 我刚看到这个,很抱歉没有早点问这个问题。所以我需要在派生列中添加两列 1)IsNumeric 和上面的公式,2)SubmissionCommon 和上面的 exp(替换 IsNumeric - 表达式),但它给了我第二个错误
    • 否,添加 2 个派生列转换,一个组件中的每一列:(2 个派生列转换 -> 在每个转换中的列上):首先 Isnumeric 然后 SubmissionControl
    • 如果你有困惑我可以添加一些截图,如果你有兴趣给我回复
    • ya .. 我会更感激的。非常感谢。
    • 我也试过了,效果很好。万分感谢!非常感谢您的耐心:)
    【解决方案2】:

    我相信这样的事情应该适合你:

    (DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) == 
    (DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) ? 
    LEFT([Work item /Submission no#], 15): 
    LEFT([Work item /Submission no#], 16)
    

    已尝试为此网站设置格式,但您可能需要删除一些退货。这应该将您的列转换为数字并将其与自身进行比较(因此,如果转换失败,它将为 NULL 并且不等于)。

    编辑:这是未格式化的字符串:

    (DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) == (DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) ? LEFT([Work item /Submission no#], 15): LEFT([Work item /Submission no#], 16)
    

    您可能还需要匹配 DT_NUMERIC 的精度和比例规格以符合您自己的要求。

    【讨论】:

    • 如果我问的是基本问题,请道歉。我是 SSIS 的新手,并且开始了解一些东西。我应该对两个派生列都使用上面的表达式吗?比如 ColA = "above expression" 和 next row ColB=" above Expression"
    • 看起来不像您最初帖子的第二列中的公式。您应该可以简单地使用 [Work item /Submission no#] 作为 SubmissionNumber。
    【解决方案3】:

    如果您更喜欢 c# 脚本组件(确保添加输入和输出列):

    string test = Rows.YourRowToTest;
    int someNum; //catches output
    
    Row.ColumnName = int.TryParse(test.Substring(4,2),out someNum) == false
                     ?test.Substring(1, 16)
                     :test.Substring(1, 15);
    

    【讨论】:

    • 即使我发布了不同的方法。我更喜欢使用脚本组件来执行此操作,因为它更强大 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多