在目标写入SSIS之前修剪?

时间:2010-10-01 10:11:02

标签: sql-server-2008 ssis

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

问题是如果我的数据库字段大小为say,firstname和lastname是30个字符,我得到输出为(用点表示的空格)

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

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

saurabh|kumar

我有超过40列要编写,我不想在我的BIG SQL查询中的每一列之后手动插入RTRIM :(

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

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

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

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

如果源数据中的数据类型为VARCHAR或NVARCHAR,并且尾随空格位于数据中,则可以更新数据以删除尾随空格。这可能也没什么吸引力。

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

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

在派生列转换中,您将使用SSIS表达式语法修剪数据。 firstname和lastname trim表达式将是

RTRIM(firstname)
RTRIM(lastname)

派生列转换的性能可能会更好,但它与脚本解决方案可能没什么不同。但是,派生列转换可能更容易阅读和理解。

答案 1 :(得分:0)

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

在MSDN中查看此示例:http://msdn.microsoft.com/en-us/library/ms345160.aspx

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

当然,优势在于它会修剪您稍后添加的未来行。

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

答案 2 :(得分:0)

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

它将使用并行性修剪行。