【问题标题】:Insert data via SSIS package and different datatypes通过 SSIS 包和不同的数据类型插入数据
【发布时间】:2014-08-31 21:42:57
【问题描述】:

我有一个 column1 nvarchar(50) 为空的表。我想将它插入到一个更“紧凑”的表中,其中 nvarchar(30) 不为空。我的想法是使用以下表达式在源任务和目标任务之间插入派生列任务:替换 column1 = (DT_WSTR,30)Column1

我收到“可能出现截断错误”,并且不允许将数据插入到新的更紧凑的表中。

此外,我 100% 确定列中没有超过 30 个字符的值。此外,我无法更改源中的列数据类型。

创建 ETL 流程的最佳方法是什么?

【问题讨论】:

    标签: sql sql-server ssis type-conversion


    【解决方案1】:

    为此,您必须使用Data Conversion Transformation,它允许将数据类型从原始 nvarchar(50) 更改为所需的 nvarchar(30)。

    您将获得具有所需数据类型的新列。

    当然,你可以通过配置这个组件来决定出现错误时该怎么做:截断。

    更新

    由于有人反对这个答案,让我们再添加 3 个 cmets:

    1. 此解决方案已检查并有效。创建一个带有 nvarchar(50) 列的表,一个带有 nvarchar(30) 列的新表,添加一个使用数据转换转换的数据流,它可以正常工作。请检查一下,我保证。此外,正如 OP 所说的“我也 100% 确定列中没有超过 30 个字符的值”,在他的情况下不会出现截断问题。不过,我建议处理可能的错误,以防万一。
    2. 来自 MSDN:"a package can perform the following types of data conversions: ... Set the column length of string data"
    3. 来自 MSDN:"If the length of an output column of string data is shorter than the length of its corresponding input column, the output data is truncated."

    【讨论】:

    • 有趣的是,知道为什么一个有效的答案有两个反对票(你可以试试),而且在 MSDN 上有很好的记录。很高兴知道投反对票的原因。
    【解决方案2】:

    JotaBe 建议使用数据转换转换。是的,这是实现相同目的的另一种方法,但如果发生截断,它也会出错。如果输入数据确实少于 30 个字符,您的方式应该 可行(我试过了)。

    您可以将派生列表达式修改为

    (DT_WSTR,30)Substring([Column1], 1, 30)
    

    【讨论】:

    • 能否检查一下派生列任务的输出列的数据类型是否为必填项?我现在没有 SSIS 来检查它。
    • 一段时间过去了,我不使用 SSIS,但我记得那让我抓狂。但是,我不确定,所以我请你检查一下。
    • 您的原始答案非常糟糕。您可以删除评论。当你创建一个派生列时,你可以设置输出列的数据类型,它工作得很好。或者更好的是,检查转换并查看它是否允许您检查数据类型。也许在旧版本中这是不可能的(我怀疑),但现在它是。
    【解决方案3】:

    考虑更改数据流中派生列组件的截断错误处置。默认情况下,截断会导致派生列组件失败。您可以将组件配置为忽略或重定向导致截断错误的行。

    为此,请打开派生列转换编辑器并单击对话框左下方的“配置错误输出...”按钮。在此处,根据需要更改任何适用列的“截断”列中的设置。

    请注意,对于忽略失败的列而截断的任何数据都不会在执行期间由 SSIS 报告。听起来您已经完成了这项工作,但请务必确保您已按现状分析数据,并在禁用截断报告之前考虑到数据性质未来可能发生的任何变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2016-12-19
      相关资源
      最近更新 更多