Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utiliser CROSS APPLY pour plus d'une colonne

Il serait peut-être plus facile de répondre à cette question si nous pouvions voir votre fonction de chaîne fractionnée. Ma réponse utilise une version de ma fonction split que j'ai.

J'inclurais dans votre fonction de fractionnement un numéro de ligne que vous pouvez utiliser pour JOINDRE la chaîne fractionnée et les valeurs fractionnées.

Fonction de fractionnement :

CREATE FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))       
returns @temptable TABLE (items varchar(MAX), rn int)       
as       
begin      
    declare @idx int       
    declare @slice varchar(8000)   
    declare @rn int = 1 -- row number that increments with each value in the delimited string

    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, rn) values(@slice, @rn)       

        set @String = right(@String,len(@String) - @idx)       
        set @rn = @rn +1

        if len(@String) = 0 break       
    end   
return 
end;

Ensuite, si vous avez plusieurs colonnes à diviser, vous pouvez utiliser une requête semblable à la suivante :

INSERT INTO dbo.tblSplitData(SplitKey, SplitString, SplitValues)
select s.rawkey,
  s.splitstring,
  v.splitvalues
from
(
  SELECT d.RawKey, d.delimitedstring, d.delimitedvalues, 
    c.items SplitString, 
    c.rn
  FROM dbo.tblRawData d
  CROSS APPLY dbo.Split(d.DelimitedString, ',') c
) s
inner join
(
  SELECT d.RawKey, d.delimitedstring, d.delimitedvalues, 
    c.items SplitValues, 
    c.rn
  FROM dbo.tblRawData d
  CROSS APPLY dbo.Split(d.DelimitedValues, ',') c
) v
  on s.rawkey = v.rawkey
  and s.delimitedstring = v.delimitedstring
  and s.rn = v.rn;

Voir SQL Fiddle avec démo

Cela utilise deux sous-requêtes qui génèrent la liste des valeurs de fractionnement, puis elles sont jointes à l'aide du numéro de ligne créé par la fonction de fractionnement.