Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Używanie CROSS APPLY dla więcej niż jednej kolumny

Odpowiedź na to może być łatwiejsza, gdybyśmy mogli zobaczyć twoją funkcję split string. Moja odpowiedź dotyczy wersji mojej funkcji podziału, którą posiadam.

Dołączyłbym do twojej funkcji podziału numer wiersza, którego możesz użyć do JOIN podzielonego ciągu i podzielonych wartości.

Funkcja podziału:

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;

Następnie, jeśli masz wiele kolumn do podzielenia, możesz użyć zapytania podobnego do następującego:

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;

Zobacz SQL Fiddle z wersją demonstracyjną

Wykorzystuje to dwa podzapytania, które generują listę wartości dzielonych, a następnie są one łączone przy użyciu numeru wiersza utworzonego przez funkcję podziału.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Odczyty nie spadają po umieszczeniu indeksu

  2. Składnia zapytania aktualizującego SQL z wewnętrznym sprzężeniem

  3. Konwertuj plik BINARY przechowywany jako VARCHAR na BINARY

  4. Łączenie się z MS SQL Server z uwierzytelnianiem Windows przy użyciu Pythona?

  5. Optymalizacja zapytań SQL