sql >> Databáze >  >> RDS >> Sqlserver

Použití CROSS APPLY pro více než jeden sloupec

Mohlo by být jednodušší na to odpovědět, kdybychom viděli vaši funkci rozděleného řetězce. Moje odpověď je pomocí verze mé funkce rozdělení, kterou mám.

Do vaší funkce rozdělení bych zahrnul číslo řádku, které můžete použít ke spojení rozděleného řetězce a rozdělených hodnot.

Funkce rozdělení:

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;

Pokud pak máte k rozdělení více sloupců, můžete použít dotaz podobný následujícímu:

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;

Viz SQL Fiddle s ukázkou

To používá dva poddotazy, které generují seznam rozdělených hodnot, pak jsou spojeny pomocí čísla řádku vytvořeného funkcí rozdělení.



  1. Jak CHAR_LENGTH() funguje v MariaDB

  2. Jak spustit úlohu SQL Server z uložené procedury?

  3. Jak zjistíte velikost disku tabulky Postgres / PostgreSQL a její indexy

  4. Výkaz z podvojného účetnictví