SSIS转换 - 将一列拆分为多列

时间:2013-09-06 13:48:27

标签: sql sql-server-2005 ssis

我正在尝试找出如何拆分表中的列,并在将结果导出为CSV文件后将其拆分为三列。

例如,我有一个名为fullpatientname的字段。它以下列文本格式列出:

Smith, John C

期望将其分为三个单独的栏目:

Smith
John
C

我很确定我必须将其拆分为派生列,但我不确定如何继续使用

4 个答案:

答案 0 :(得分:4)

您将需要为此过程使用派生列。

SUBSTRING和FINDSTRING功能将是解决此问题的关键。

要获得第一个细分,您可以使用以下内容:

  

(DT_STR,25,1252)SUBSTRING([fullpatientname],1,FINDSTRING(“,”,[fullpatientname],1)-1)

上面应该显示一个从[fullpatientname]的开头到逗号(,)之前的位置的子字符串。

下一个段将从逗号后面的位置到最终的空间分隔符,最后一个是从最后一个空格分隔符后的位置到结尾的所有内容。

答案 1 :(得分:3)

听起来就像你的商业规则是

  1. "姓氏"是第一个逗号的所有字符
  2. "名字"将是第一个逗号和空格后的所有字符
  3. "中间名"将是什么(并且它总是存在)?
    1. 字符串中的最后一个字符(您将只有一个首字母)
    2. 第二个空格后的所有字符
  4. 这种逻辑会以很多有趣的方式失败,所以要做好准备。还要记住,一旦将信息组合在一起,就不能以100的准确度将其恢复到组件部分。捕获第一个,中间的,最后一个/姓氏并分别存储它们。

    方法A

    派生列组件。实际上,添加到您的数据流中的一些将涵盖这一点。第一个派生列的任务是查找名称中断的位置。这个可以在一个组件中完成,但调试成为一个挑战,然后你需要在一行中多次引用相同的表达式* 3它很快就会成为维护的噩梦。

    然后,第二个派生列将使用第一个派生列中定义的位置调用LEFTSUBSTRING函数来访问列中的点

    方法B

    我从来没有首先找到一个脚本组件,同样适用于你。但是,对于脚本来说,这是一个非常好的案例。基本.NET字符串库具有Split函数,该函数将根据您提供的分隔符将字符串分成多个部分。默认值为空格。第一次分组调用将使用','作为论点。零序数字符串将是姓氏。第一个序号字符串将包含第一个和中间名称。再次调用string.Split方法,这次使用默认值,最后一个元素是中间名,其余元素称为名字。反之亦然,零点元素是第一个名称,其他一切都是最后一个。

    之前我必须处理清洁名称,所以我根据他们想要如何标准化名称来看到不同的规则。

答案 2 :(得分:2)

如果你的名字总是采用相同的格式(LastName-comma-space-FirstName-space-MI),请尝试这样的事情:

declare @FullName varchar(25) = 'Smith, John C'

select 
substring(@FullName, 1, charindex(',', @FullName)-1 ) as LastName,
substring(@FullName, charindex(',',@FullName) + 2, charindex(' ',@FullName,charindex(',',@FullName)+2) - (charindex(',',@FullName) + 2) ) as FirstName,
substring(@FullName, len(@FullName), 1) as MiddleInitial

答案 3 :(得分:2)

我在Visual Studio 2015中使用带有SSIS的SQL SERVER 2016.如果您使用的是findstring,则需要确保订单正确。我先尝试过 -  FINDSTRING(“,”,[fullpatientname],1),但它不起作用。我不得不查阅文档,发现订单不正确。 FINDSTRING([fullpatientname],“,”,1)为我解决了问题。我不确定这是否是由于版本的差异造成的。

相关问题