通过SSIS包和不同的数据类型插入数据

时间:2014-07-10 13:29:19

标签: sql sql-server ssis type-conversion

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

我得到“截断可能发生错误”,我不允许将数据插入新的更严格的表中。

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

您将获得一个包含所需数据类型的新列。

当然,您可以通过配置此组件来决定在发生错误时如何处理:截断。

<强>更新

由于有人对这个答案进行了评价,我们再添加3条评论:

  1. 检查此解决方案并正常工作。创建一个包含nvarchar(50)列的表,一个带有nvarchar(30)列的新表,添加一个使用数据转换转换的数据流,它可以解决一个小问题。请保证,谢谢。此外,由于OP指出“我也100%确定列中没有值超过30个字符”,在他的情况下,不存在截断问题。但是,我建议处理可能的错误,以防它们发生。
  2. 来自MSDN的
  3. "a package can perform the following types of data conversions: ... Set the column length of string data"
  4. 来自MSDN的
  5. "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."

答案 2 :(得分:0)

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

要执行此操作,请打开“派生列转换”编辑器,然后单击“配置错误输出...”。对话框左下角的按钮。在此处,更改“截断”中的设置。任意适用列的列。

Row Error Disposition Settings

请注意,SSIS在执行期间不会报告任何针对忽略失败的列而截断的数据。听起来您已经这样做了,但确保您已经分析了当前的数据并考虑到在禁用之前数据性质未来可能发生的任何变化,这一点非常重要。截断报告。