SQL рд╕рд░реНрд╡рд░ рдореЗрдВ рдбреЗрдЯрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкрд╛рда рдпрд╛ рдмреНрд▓реЙрдмреНрд╕ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛
рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рда
рдореЗрд░реЗ рдХреБрдЫ рдЕрдиреНрдп SQL рдлрд╝рдВрдХреНрд╢рди рд▓реЗрдЦреЛрдВ рдХреЗ рдмрд╛рдж, рдпрд╣ рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдкрдиреЗ CMS рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд╛рдж рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред
рдлрд┐рд░ рд╣рдо рд▓реМрдЯрд╛рдП рдЧрдП рд░рд┐рдХреЙрд░реНрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдбреБрдкреНрд▓реАрдХреЗрдЯ рдбрд┐рд▓реАрдореАрдЯрд░ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рд▓реАрдореАрдЯрд░ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдкрд░ рд╢рдмреНрдж рдХреЛ рдШреЛрд╖рд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рд╢реБрд░реБрдЖрдд рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдХреАрдорд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рд╕реНрдХреАрдорд╛ рдмрд╛рдЙрдВрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬреЛ рдХрд┐ рдПрдХ рдЯреЗрдмрд▓ рд╕реЗ рднреА рдмрдВрдзреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
SQL рд╕рд░реНрд╡рд░ 2016 рдореЗрдВ, рдЗрдирдмрд┐рд▓реНрдЯ рдлрд╝рдВрдХреНрд╢рди STRING_SPLIT рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЬрдм рддрдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдВрд╕реНрдХрд░рдг 130 рд╕реЗ рдКрдкрд░ рдХреА рд╕рдВрдЧрддрддрд╛ рд╣реИ, рддрдм рддрдХ рдЖрдк рдЗрд╕реЗ рдПрдХрд▓ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдХрд╛рдо рдЖрдЧреЗ рдмрдврд╝рд╛ рд╣реИ, рд╣рдордиреЗ string_split рдХреЛ рдкрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рдЕрдм рдЯреЗрдХреНрд╕реНрдЯ рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдХреЗрд╡рд▓ рдХреБрдЫ рдХреЙрд▓рдо рдкрд░ рд╣реА рдореМрдЬреВрдж рд╣реЛрдВред
SQL Code - Basic Function
CREATE FUNCTION [dbo].[TextToRows](@Delim NVARCHAR(10),@Value NVARCHAR(MAX))--Delimeter and Search StringRETURNS @Table TABLE(WordInt BIGINT IDENTITY(1,1) PRIMARY KEY,WordStr NVARCHAR(MAX)) WITH SCHEMABINDING --Return TableAS BEGINSET @Value=LTRIM(RTRIM(@Value))--Trim forward/trailing spacesWHILE (CHARINDEX(@Delim+@Delim,@Value,1)<>0) BEGINSET @Value=REPLACE(@Value,@Delim+@Delim,@Delim)--Remove double delims (if required)...ENDDECLARE @CurPos BIGINTSET @CurPos=0DECLARE @NextPos BIGINTSET @NextPos=CHARINDEX(@Delim,@Value,@CurPos+1)WHILE @NextPos>0 BEGININSERT INTO @Table(WordStr)SELECT REPLACE(SUBSTRING(@Value,@CurPos,(@NextPos-@CurPos)),@Delim,'')--Add first word if existsSET @CurPos=@NextPosSET @NextPos=CHARINDEX(@Delim,@Value,@CurPos+1)ENDINSERT INTO @Table(WordStr) SELECT REPLACE(SUBSTRING(@Value,@CurPos,LEN(@Value)),@Delim,'')--Add last word (or whole word)RETURNENDGOSELECT * FROM TextToRows(',','Gavin,Clayton,Test,Data')
Result
Clayton
Test
Data
New SQL Code - With Text Qualifiers
CREATE FUNCTION dbo.[TextToRowsText](@Delim NVARCHAR(10),@Value NVARCHAR(MAX),@Text NVARCHAR(1))--Delimeter and Search StringRETURNS @Table TABLE(WordInt BIGINT IDENTITY(1,1) PRIMARY KEY,WordStr NVARCHAR(MAX)) --Return TableAS BEGINDECLARE @TextOn INT=(CASE WHEN LEFT(@Value,1)=@Text AND LEN(@Text)>0 THEN 1 ELSE 0 END)DECLARE @NextPos BIGINT=CHARINDEX((CASE WHEN @TextOn=1 THEN @Text+@Delim ELSE @Delim END),@Value,LEN(@Delim)+(@TextOn))WHILE @NextPos>0 BEGININSERT INTO @Table(WordStr) SELECT SUBSTRING(@Value,LEN(@Text)+@TextOn,(@NextPos-(LEN(@Text)+@TextOn)))SET @Value=SUBSTRING(@Value,@NextPos+@TextOn+LEN(@Delim),9999999)SET @TextOn=(CASE WHEN LEFT(@Value,1)=@Text AND LEN(@Text)>0 THEN 1 ELSE 0 END)SET @NextPos=CHARINDEX((CASE WHEN @TextOn=1 THEN @Text+@Delim ELSE @Delim END),@Value,LEN(@Text)+@TextOn)ENDSET @TextOn=(CASE WHEN LEFT(@Value,1)=@Text AND LEN(@Text)>0 THEN 1 ELSE 0 END)IF LEN(@Value)>0 INSERT INTO @Table(WordStr) SELECT SUBSTRING(@Value,LEN(@Text)+@TextOn,(CASE WHEN RIGHT(@Value,1)=@Text THEN LEN(@Value)-(LEN(@Text)+@TextOn) ELSE 9999999 END))RETURNENDGOSELECT * FROM dbo.TextToRowsText(',','Gavin,"Clayton","Test",Data','"')
рдкрд┐рд╡реЛрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ
рдЖрдк рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рд╕реЗ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХрд╛рдзрд┐рдХ рд╕реАрдорд╛рдВрдХрдХреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ PIVOT рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рдкрд░ рд▓рд╛рдЧреВ рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдПрдХ рдбрдмрд▓ рд╕реАрдорд╛рдВрдХрд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╛рдкрд╕ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╕реЗ рдЖрдк рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдмреАрдЪ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреИрд░реЗрдХреНрдЯрд░ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рддреЗрдЬреА рд╕реЗ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЖрдк рд▓рдВрдмрд╛рдИ рдореЗрдВ 10 рд╡рд░реНрдгреЛрдВ рддрдХ рдПрдХ рд╕реАрдорд╛рдВрдХрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Double Delimited & Pivot
DECLARE @Str NVARCHAR(1000)='1;1.2;1.2.3;1.2.3.4'SELECT * FROM (SELECT ttr.WordStr Orig,ttr2.WordInt,ttr2.WordStrFROM dbo.TextToRows(';',@Str) ttrOUTER APPLY dbo.TextToRows('.',ttr.WordStr) ttr2) ttrdPIVOT (MAX(WordStr) FOR WordInt IN ([1],[2],[3],[4])) Piv
Double Delimited Pivot Result
Orig | 1 | 2 | 3 | 4 |
1 | 1 | NULL | NULL | NULL |
1.2 | 1 | 2 | NULL | NULL |
1.2.3 | 1 | 2 | 3 | NULL |
1.2.3.4 | 1 | 2 | 3 | 4 |