Query SQL per dividere i dati della colonna in righe

Sto avendo tabella SQL in che sto avendo 2 campi come No e declaration

 Code Declaration 123 a1-2 nos, a2- 230 nos, a3 - 5nos 

Devo visualizzare la dichiarazione per quel codice come:

 Code Declaration 123 a1 - 2nos 123 a2 - 230nos 123 a3 - 5nos 

Ho bisogno di dividere i dati della colonna in righe per quel codice.

Per questo tipo di separazione dei dati, suggerirei di creare una funzione di divisione:

 create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1)) returns @temptable TABLE (items varchar(MAX)) as begin declare @idx int declare @slice varchar(8000) select @idx = 1 if len(@String)<1 or @String is null return while @idx!= 0 begin set @idx = charindex(@Delimiter,@String) if @idx!=0 set @slice = left(@String,@idx - 1) else set @slice = @String if(len(@slice)>0) insert into @temptable(Items) values(@slice) set @String = right(@String,len(@String) - @idx) if len(@String) = 0 break end return end; 

Quindi, per utilizzare questo in una query, puoi utilizzare un outer apply per partecipare alla tua tabella esistente:

 select t1.code, s.items declaration from yourtable t1 outer apply dbo.split(t1.declaration, ',') s 

Quale produrrà il risultato:

 | CODE | DECLARATION | ----------------------- | 123 | a1-2 nos | | 123 | a2- 230 nos | | 123 | a3 - 5nos | 

Vedi SQL Fiddle con Demo

Oppure puoi implementare una versione CTE simile a questa:

 ;with cte (code, DeclarationItem, Declaration) as ( select Code, cast(left(Declaration, charindex(',',Declaration+',')-1) as varchar(50)) DeclarationItem, stuff(Declaration, 1, charindex(',',Declaration+','), '') Declaration from yourtable union all select code, cast(left(Declaration, charindex(',',Declaration+',')-1) as varchar(50)) DeclarationItem, stuff(Declaration, 1, charindex(',',Declaration+','), '') Declaration from cte where Declaration > '' ) select code, DeclarationItem from cte 
 Declare @t Table([Code] int, [Declaration] varchar(32)); Insert Into @t([Code], [Declaration]) Values(123, 'a1-2 nos, a2- 230 nos, a3 - 5nos') Select x.[Code] ,t.Declaration From ( Select *, Cast(''+Replace(t.[Declaration],',','')+'' As XML) As record From @tt )x Cross Apply ( Select fdata.D.value('.','varchar(50)') As Declaration From x.record.nodes('X') As fdata(D) ) t 

Poche volte indietro, ho bloggato circa la stessa funzione di divisione in SQL Server utilizzando l’approccio di base impostato

Inoltre, si prega di visitare il blog Erland Sommarskog che sta mantenendo la risposta per lo stesso dagli ultimi 15 anni.

Prova questo….

 declare @col1 varchar(100),@CurentSubString varchar(100) create table #temp ( col1 varchar(50) ) DECLARE CUR CURSOR FOR SELECT col1 FROM your_table open CUR FETCH next FROM CUR INTO @col1 WHILE @@FETCH_STATUS = 0 BEGIN WHILE CHARINDEX (@col1, ';') <> 0 BEGIN SET @CurentSubString = SUBSTRING(@col1,1,CHARINDEX (@col1, ';')) SET @col1 = SUBSTRING(@col1,CHARINDEX (@col1, ';')+1,len(@col1)) insert into #temp select @CurentSubString END IF CHARINDEX (@col1, ';') = 0 and isnull(@col1,'')!= '' BEGIN INSERT INTO #temp SELECT @col1 END FETCH next FROM CUR INTO @col1 END select * From #temp CLOSE CUR DEALLOCATE CUR