sql >> Databasteknik >  >> RDS >> Sqlserver

Använder CROSS APPLY för mer än en kolumn

Det kan vara lättare att svara på detta om vi kunde se din split string-funktion. Mitt svar är att använda en version av min delade funktion som jag har.

Jag skulle inkludera ett radnummer i din split-funktion som du kan använda för att GÅ MED i den delade strängen och de delade värdena.

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;

Om du sedan har flera kolumner att dela kan du använda en fråga som liknar följande:

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;

Se SQL-fiol med demo

Detta använder två underfrågor som genererar listan med delade värden, sedan sammanfogas de med hjälp av radnumret som skapats av splitfunktionen.



  1. Prestandakonsekvenser av att tillåta att alias används i HAVING-klausulen

  2. hur man returnerar en dynamisk resultatuppsättning i Oracle-funktionen

  3. SQL, skapa en tabell

  4. Körs totalt över upprepande grupp för objekt baserat på tid i Oracle SQL