Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на CROSS APPLY за повече от една колона

Може би ще бъде по-лесно да отговорим на този въпрос, ако можем да видим вашата функция за разделен низ. Моят отговор е да използвам версия на моята функция за разделяне, която имам.

Бих включил във вашата функция за разделяне номер на ред, който можете да използвате, за да ПРИСЪЕДИНИТЕ разделения низ и разделените стойности.

Функция за разделяне:

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;

След това, ако имате няколко колони за разделяне, можете да използвате заявка, подобна на следната:

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;

Вижте SQL Fiddle с демонстрация

Това използва две подзаявки, които генерират списъка с разделени стойности, след което те се обединяват с помощта на номера на реда, създаден от функцията за разделяне.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Индекс на SQL Server Обратно сканиране:разбиране, настройка

  2. Получаване на броя дни от седмицата (неделя, понеделник, вторник) между две дати SQL

  3. Преобразувайте „datetime2“ в „date“ в SQL Server (T-SQL примери)

  4. Групови вмъквания на силно индексирани дъщерни елементи (Sql Server 2008)

  5. Променлива на SQL сървър:цикъл срещу дубликат?