• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 831
  • Last Modified:

SSIS Integration Services Question- how to duplicate rows on data-flow

I have a table with Last_Name, Address,Zip etc.

Last_name has names like 'Tinker-Sackett' and 'Schiff-Seehafer'

I would like to find a way to split those names into the two parts and return duplicate rows of all other fields. So for example if I had a dataset with one row:
last_name = 'Tinker-Sackett'
zip = '99999'
I would want three  records coming out of data-flow:
1 with 'Tinker-Sackett' as last_name and zip = '99999'
1 with 'Tinker' as last_name and zip = '99999'
1 with 'Sackett' as last_name and zip = '99999'

So you can see- i need it split by a '-' and the '-' removed.

Is there a way to do this in a scripting object or even SQL?

2 Solutions
Within SSIS, you might use a multicast to break up your dataset in to 3 identical ones.

Within each dataset (from the multicast), use a derived column to get just the data you want.  Use expressions to break up the last name.  

See link below for samples of parsing column data.

Then each multicast would end up loading the data to the same table.

Should have 3 rows for each record.

See this link for how to use multicast:


Hi there mdoolittle:

While it is doable in SSIS, another option would be to use SQL. It just comes down to what you are more comfortable with. With this code, you will also get a handy table-valued function to split other delimited lists in the future; I have used it for years.

(big props to a colleague of mine for the function: James S.)

/**********BEGIN FUNCTION******************/
create function [dbo].[udf_ParseToString] (@StringIn varchar(8000), @Delimiter varchar(10))
returns @data table (val varchar(8000))
Comments:	Returns result with a parsed value per row.
  declare @start int, @end int
  if @StringIn is null set @StringIn = ''
  set @start = 1
  while @start <= len(@StringIn)
    set @end = charindex(@Delimiter, @StringIn, @start)
    if @end = 0
      set @end = len(@StringIn)
      set @end = @end - 1 -- prior to delimiter
    if @end >= @start
      insert @data values (substring(@StringIn, @start, @end - @start + 1))
    set @start = @end + len(@Delimiter) + 1 -- skip past delimiter
/**********END FUNCTION******************/

declare @TestyWesty table(
    LastName varchar(255)
    ,ZipCode varchar(255)

insert into @TestyWesty values('Tinker-Bell', '99999')

select  LastName, ZipCode
from    @TestyWesty
select  ParseIt.val as LastName, ZipCode
from    @TestyWesty
apply   dbo.udf_ParseToString(LastName, '-') as ParseIt

Open in new window

mdoolittleAuthor Commented:
Nice parsing script - i wonder with my table of 30 million rows if the UNION query will slow things down. I will try it out.

I will also try out derived columns in SSIS

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now