sql >> Database >  >> RDS >> Sqlserver

CROSS APPLY gebruiken voor meer dan één kolom

Het is misschien gemakkelijker om dit te beantwoorden als we je gesplitste tekenreeksfunctie zouden kunnen zien. Mijn antwoord is het gebruik van een versie van mijn split-functie die ik heb.

Ik zou in je split-functie een rijnummer opnemen dat je kunt gebruiken om de split-string en de split-waarden samen te voegen.

Split-functie:

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;

Als u vervolgens meerdere kolommen wilt splitsen, kunt u een zoekopdracht gebruiken die lijkt op de volgende:

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;

Zie SQL Fiddle met demo

Dit maakt gebruik van twee subquery's die de lijst met gesplitste waarden genereren, waarna ze worden samengevoegd met behulp van het rijnummer dat door de splitsingsfunctie is gemaakt.



  1. Oracle SQL - Hoe krijg ik verschillende rijen met behulp van de analytische functie RANK() of DENSE_RANK() of ROW_NUMBER()?

  2. Keuzerondjes ng-gecontroleerd met ng-model

  3. Veroorzaakt door:android.database.sqlite.SQLiteException:geen dergelijke tabel:(code 1) Android

  4. SQL Server 2008 + PCI-compliance? Betreft PCI, evenals symmetrische sleutels!