Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I've already answered an incredibly similar question today, so look at the answer:</p> <p><a href="https://stackoverflow.com/questions/2341374/sql-comma-delimted-column-to-rows-then-sum-totals/2341510#2341510">SQL comma delimted column =&gt; to rows then sum totals?</a></p> <p>but try this:</p> <p><a href="http://www.sommarskog.se/arrays-in-sql-2005.html#tblnum" rel="nofollow noreferrer">I prefer the number table approach to split a string in TSQL</a></p> <p>For this method to work, you need to do this one time table setup:</p> <pre><code>SELECT TOP 10000 IDENTITY(int,1,1) AS Number INTO Numbers FROM sys.objects s1 CROSS JOIN sys.objects s2 ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number) </code></pre> <p>Once the Numbers table is set up, create this split function:</p> <pre><code>CREATE FUNCTION [dbo].[FN_ListToTable] ( @SplitOn char(1) --REQUIRED, the character to split the @List string on ,@List varchar(8000)--REQUIRED, the list to split apart ) RETURNS TABLE AS RETURN ( ---------------- --SINGLE QUERY-- --this will not return empty rows ---------------- SELECT ListValue FROM (SELECT LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue FROM ( SELECT @SplitOn + @List + @SplitOn AS List2 ) AS dt INNER JOIN Numbers n ON n.Number &lt; LEN(dt.List2) WHERE SUBSTRING(List2, number, 1) = @SplitOn ) dt2 WHERE ListValue IS NOT NULL AND ListValue!='' ); GO </code></pre> <p>You can now easily split a CSV string into a table and join on it:</p> <pre><code>select * from dbo.FN_ListToTable(',','1,2,3,,,4,5,6777,,,') </code></pre> <p>OUTPUT:</p> <pre><code>ListValue ----------------------- 1 2 3 4 5 6777 (6 row(s) affected) </code></pre> <p>Your can now use a CROSS APPLY to split every row in your table like:</p> <pre><code>DECLARE @YourTable table (RowID int, RowValue varchar(200)) INSERT INTO @YourTable VALUES (1,'KEY11:VALUE11;KEY12:VALUE12;KEY13:VALUE13') INSERT INTO @YourTable VALUES (2,'KEY21:VALUE21;KEY22:VALUE22;KEY23:VALUE23') INSERT INTO @YourTable VALUES (3,'KEY31:VALUE31;KEY32:VALUE32;KEY33:VALUE33') SELECT o.RowID,RIGHT(st.ListValue,LEN(st.ListValue)-CHARINDEX(':',st.ListValue)) AS RowValue FROM @YourTable o CROSS APPLY dbo.FN_ListToTable(';',o.RowValue) AS st </code></pre> <p>OUTPUT:</p> <pre><code>RowID ----------- ------- 1 VALUE11 1 VALUE12 1 VALUE13 2 VALUE21 2 VALUE22 2 VALUE23 3 VALUE31 3 VALUE32 3 VALUE33 (9 row(s) affected) </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload