Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 703
  • Last Modified:

Find Semi-Colon and split into temp table

Hi, I have a table with two columns, ID, Recipients.

ID      Recipients
1      badboy@microsoft.com
2      rudeboy@microsoft.com;bill.gates@microsoft.co.uk
3      nutter@oracle.com;paul.jones@oracle.co.uk;diamondgeezer@mobiles.com
4      itsupport@spectrum.com

What I want to do is create a another temporary table that will have the same columns but I
want the output to appear like below

ID      Recipients
1      badboy@microsoft.com
2      rudeboy@microsoft.com
2      bill.gates@microsoft.co.uk
3      nutter@oracle.com
3      paul.jones@oracle.co.uk
3      diamondgeezer@mobiles.com
4      itsupport@spectrum.com

So what I want it to do is to go through the recipients column and find if there is
a semi-colon ';' if there is that will mean there is more that one email address so will need
to appear as one row in the temp table.

Thanks
0
sqlman08
Asked:
sqlman08
1 Solution
 
Ashok KumarCommented:
use can make use the below Function which will split based on a delimiter

create FUNCTION [dbo].[GetValuesFromList](
                    @List as Varchar(4000)
                    )

RETURNS @Table Table(Value Varchar(50))

AS    
Begin
     Declare @Sep          Varchar(1)
     Declare @Loc          Int
     Declare @Value     Varchar(100)
         
     
     If LTrim(RTrim(@List)) <> ''
     Begin
     
          Set @Sep = ';'  --- Mention the delimiter
          Set @List = @List + @Sep
         
          While PatIndex('%'+@Sep+'%',@List) <> 0
          Begin
               Set @Loc  =      PatIndex('%'+@Sep+'%',@List)
               Set @Value =     LTrim(Left(@List,@Loc-1))
               Set @List =      Stuff(@List,1,@Loc,'')

               
               
               Insert Into @Table(Value) Values (@Value)
     
          End --While
     End --If
     RETURN
End

go

declare @myArry varchar(1000)
select @myArry ='Oracle;Bill Gates;Windows;SQL 2008;ASP.NET'

select * from dbo.GetValuesFromList(@myArry)
0
 
BrandonGalderisiCommented:
This will do it very fast without any looping, but requires a table of sequential numbers.

A table of sequential numbers is VERY useful in SQL Server not use for this.  If you have a table like that already, replace the table name below in place of vw_nums and the column name containing the number in place of n.
if object_id('[dbo].[fn_DelimitedToTable]') is not null
     drop function [dbo].[fn_DelimitedToTable]
go
create function [dbo].[fn_DelimitedToTable](@DelimitedString nvarchar(max), @Delimiter nvarchar(32))
returns @Values TABLE
     (ident         int not null identity primary key clustered
     ,thePosition   int not null
     ,theValue      nvarchar(max)
     )
as
begin
 
insert into @Values (thePosition,theValue)
		select n, substring(@delimiter + @DelimitedString + @delimiter, n + (datalength(@delimiter)/2), charindex(@delimiter, @delimiter + @DelimitedString + @delimiter, n + len(@delimiter)) - n - len(@delimiter)) as string_value
		from	dbo.vw_Nums
		where
			n <= (datalength(@delimiter + @DelimitedString + @delimiter)/2) - (datalength(@delimiter)/2)
			and substring(@delimiter + @DelimitedString + @delimiter, n, (datalength(@delimiter)/2)) = @delimiter
 
 
 
return
end

Open in new window

0
 
BrandonGalderisiCommented:
Usage:


select theValue from [dbo].[fn_DelimitedToTable]('a;b;c;d;e;f;g',';')

Open in new window

0

Featured Post

Veeam Disaster Recovery in Microsoft Azure

Veeam PN for Microsoft Azure is a FREE solution designed to simplify and automate the setup of a DR site in Microsoft Azure using lightweight software-defined networking. It reduces the complexity of VPN deployments and is designed for businesses of ALL sizes.

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