【问题标题】:Trim before destination write in SSIS?在 SSIS 中写入目标之前修剪?
【发布时间】:2014-04-28 06:07:23
【问题描述】:

我有一个数据流,其中有一个数据库源和一个平面文本文件目标(由管道“|”分隔)。 数据库源正在从变量中提取 SQL 查询。

问题是,如果我的数据库字段大小,比如名字和姓氏是 30 个字符,我得到的输出为(由点表示的空格)

saurabh......................|kumar.......................

我需要的是要修剪的字段,以便实际输出是

saurabh|kumar

我有 40 多列要写,我不想在我的 BIG sql 查询的每一列之后手动插入 RTRIM :(

我应该补充一点,源最多可以返回 50,000 行。我正在考虑在两者之间放置一个脚本组件,但处理每一行可能会对性能产生影响。

有什么想法吗?

【问题讨论】:

    标签: sql-server-2008 ssis


    【解决方案1】:

    您有很多选择,但由于您的情况,有些显然是不可取的或不可能做的。

    首先,我假设数据中的尾随空格是因为源列的数据类型是 CHAR 或 NCHAR。您可以将源数据库中的数据类型更改为 VARCHAR 或 NVARCHAR。这可能不是一个好主意。

    如果源数据中的数据类型是 VARCHAR 或 NVARCHAR 并且数据中有尾随空格,您可以更新数据以删除尾随空格。这可能也不吸引人。

    因此,您拥有 SSIS,处理此问题的最佳位置是在数据流中。不幸的是,您必须为每个包含尾随空格的列开发一个解决方案。我认为您不会找到快速简单的“修复所有列”解决方案。

    您可以使用脚本转换进行数据修剪,但您必须编写代码才能完成这项工作。或者,您可以使用派生列转换组件。在派生列转换中,您将为需要修剪的每一列添加派生列。例如,您将有一个 firstname 列和一个 lastname 列。派生列值将替换现有列值。

    在派生列转换中,您将使用 SSIS 表达式语法来修剪数据。名字和姓氏修剪表达式将是

    RTRIM(firstname)
    RTRIM(lastname)
    

    派生列转换的性能可能会更好,但它可能与脚本解决方案差别不大。不过,派生列转换以后可能会更容易阅读和理解。

    【讨论】:

    • 我为此使用了派生列转换。
    【解决方案2】:

    您可以尝试在数据流中使用脚本组件吗?与控制流不同,数据流脚本组件具有输入和输出。

    看MSDN中的这个例子:http://msdn.microsoft.com/en-us/library/ms345160.aspx

    如果可以在行 (?) 流经脚本组件时对其进行迭代,则可以对列的数据进行 .Net 修剪,然后将修剪后的行传递到输出。

    优势当然是它会修剪你以后添加的未来行。

    只是一个想法,我自己没有尝试过。如果有效,请回帖。

    【讨论】:

    • 我可能有多达 50,000 行,大约 40 列。我猜,虽然脚本组件单独处理每个组件可能会对性能产生严重影响:/
    • @Saurabh - 我为不同的任务使用了脚本数据流组件,性能很好。在那一个中​​,我取了一个分隔字符串并将其拆分为列,然后将每一行发送到输出缓冲区。我会说值得一试 - 50k 行和 40 列并不多,
    【解决方案3】:

    看到这个: http://masstrimmer.codeplex.com

    它将使用并行度来修剪行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      相关资源
      最近更新 更多