【问题标题】:Derived Column Editor派生列编辑器
【发布时间】:2010-06-08 10:03:39
【问题描述】:

我需要为数据流中的列分配格式化日期。我添加了一个派生形状并为新列输入了以下表达式 - 派生列 =“添加为新列”:

"BBD" + SUBSTRING((DT_WSTR,4)DATEADD("Day",30,GETDATE()),1,4) + 
SUBSTRING((DT_WSTR,2)DATEADD("Day",30,GETDATE()),6,2) + 
SUBSTRING((DT_WSTR,2)DATEADD("Day",30,GETDATE()),9,2)

问题在于派生列转换编辑器自动分配了Unicode string[DT_WSTR] 的数据类型和“7”的长度。但是字符串的长度是11,所以每次都会抛出如下异常:

[Best Before Date [112]] Error: The "component "Best Before Date" (112)" failed 
because truncation occurred, and the truncation row disposition on "output column
"Comments" (132)" specifies failure on truncation. A truncation error occurred 
on the specified object of the specified component.

有谁知道为什么编辑坚持长度为 7?我似乎无法改变这一点。

非常感谢,

罗伯。

【问题讨论】:

    标签: ssis


    【解决方案1】:

    我不明白为什么 SSIS 测量该列只产生一个 7 个字符的字段 - 但要强制它为其提供一个 11 个字符的列,请将您的表达式稍微修改为:

    (DT_WSTR, 11)("BBD" + SUBSTRING((DT_WSTR,4)DATEADD("Day",30,GETDATE()),1,4) + SUBSTRING((DT_WSTR, 2)DATEADD("Day",30,GETDATE()),6,2) + SUBSTRING((DT_WSTR,2)DATEADD("Day",30,GETDATE()),9,2))强>

    【讨论】:

    • 嗨,托德,我想这就是我在之前的评论中所说的。关于 7 的默认长度:我确实注意到第一个连接(3 个字符的字符串加上第一个子字符串)导致 7 个字符。 @Rob:可能是您最初对该字段有不同的表达式,导致 7 个字符?
    【解决方案2】:

    你想要的是:

    "BBD" + (DT_WSTR,4)YEAR(DATEADD("Day",30,GETDATE())) 
    + RIGHT("0" + (DT_WSTR,2)MONTH(DATEADD("Day",30,GETDATE())),2) 
    + RIGHT("0" + (DT_WSTR,2)DAY(DATEADD("Day",30,GETDATE())),2)
    

    问题在于您如何将日期转换为字符串。对 DATEADD 的调用返回完整的日期和时间。接下来,您可以使用 (DT_WSTR,4) 或 (DT_WSTR,2) 将该日期转换为 4 或 2 字符串。在我的系统上,将日期时间转换为字符串默认为“Aug 24 2011 4:18PM”。所以前 4 个字符得到“Aug”,前 2 个字符得到“Au”。然后,您将使用 SUBSTRING 提取子字符串。对于您对 SUBSTRING 的最后两次调用,您从将日期转换为的 2 个字符串的末尾开始子字符串。这就是 SSIS 显示 7 个字符的原因:

    "BBD" + "Aug " + "" + ""
      3   +    4   +  0 +  0  =  7
    

    最好使用内置函数从日期时间中提取年、月和日,而不是转换为字符串然后抓取子字符串。如果您真的想使用子字符串,则需要添加对 CONVERT 的调用以将日期时间转换为特定的字符串格式,否则您将获得 Windows 中区域设置的默认值。这在每台 PC 上可能不同。

    【讨论】:

      【解决方案3】:

      您使用的是什么版本的 SQL 和服务包?

      我刚刚在我的机器上尝试过,将结果大小从 7 更改为 11 没有问题。可能是您没有安装所有服务包吗?

      【讨论】:

      • 在 SQL 2008 中,您不能再手动更改数据类型,您需要将其显式转换为您需要的任何内容。
      【解决方案4】:

      您是否要替换现有字段,并且该字段可能有 7 个字符长?派生列转换的问题是您无法更改现有字段的字段类型(包括长度)。

      尝试添加一个新字段。

      如果这不起作用,请尝试在整个表达式周围添加显式转换。

      (DT_WSTR,11)("BBD" + SUBSTRING((DT_WSTR,4)DATEADD("Day",30,GETDATE()),1,4) + SUBSTRING((DT_WSTR,2)DATEADD("Day",30,GETDATE()),6,2) + SUBSTRING((DT_WSTR,2)DATEADD("Day",30,GETDATE()),9,2))
      

      【讨论】:

      • 不,我设置了
      • 我明白了。在整个表达式周围添加一个显式转换怎么样? (DT_WSTR,11)("BBD" + SUBSTRING((DT_WSTR,4)DATEADD("Day",30,GETDATE()),1,4) + SUBSTRING((DT_WSTR,2)DATEADD("Day",30, GETDATE()),6,2) + SUBSTRING((DT_WSTR,2)DATEADD("Day",30,GETDATE()),9,2))
      • 顺便说一句:SSIS 知道 DATEPART 函数可以用来代替那些 SUBSTRING:msdn.microsoft.com/en-us/library/ms137586.aspx
      【解决方案5】:

      右键单击“派生列”打开“显示高级编辑器”选择“输入和输出属性”选项卡。
      转到“派生列输出”=>“输出列”=>“派生列 1”(由您添加)

      在右侧面板中转到“数据类型属性”部分=> DataType=>

      选择“字符串 [DT_STR]

      点击确定Image showing steps

      这将解决您的问题。

      【讨论】:

        猜你喜欢
        • 2018-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多