Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwendung von CROSS APPLY für mehr als eine Spalte

Es könnte einfacher sein, dies zu beantworten, wenn wir Ihre Split-String-Funktion sehen könnten. Meine Antwort ist die Verwendung einer Version meiner Split-Funktion, die ich habe.

Ich würde in Ihre Split-Funktion eine Zeilennummer einfügen, mit der Sie die Split-Zeichenfolge und die Split-Werte VERBINDEN können.

Split-Funktion:

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;

Wenn Sie dann mehrere Spalten teilen müssen, können Sie eine Abfrage ähnlich der folgenden verwenden:

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;

Siehe SQL Fiddle mit Demo

Dies verwendet zwei Unterabfragen, die die Liste der Split-Werte generieren, dann werden sie unter Verwendung der Zeilennummer verbunden, die von der Split-Funktion erstellt wurde.