Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sử dụng ÁP DỤNG CROSS cho nhiều cột

Có thể dễ dàng trả lời điều này hơn nếu chúng tôi có thể thấy hàm chia chuỗi của bạn. Câu trả lời của tôi là sử dụng một phiên bản của hàm phân tách mà tôi có.

Tôi sẽ bao gồm trong hàm phân tách của bạn một số hàng mà bạn có thể sử dụng để THAM GIA chuỗi phân tách và các giá trị phân tách.

Chức năng phân chia:

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;

Sau đó, nếu bạn có nhiều cột để tách, bạn có thể sử dụng một truy vấn tương tự như sau:

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;

Xem SQL Fiddle with Demo

Điều này sử dụng hai truy vấn con tạo ra danh sách các giá trị tách, sau đó chúng được nối với nhau bằng cách sử dụng số hàng được tạo bởi hàm tách.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thời gian chờ của truy vấn SQL Server tùy thuộc vào mệnh đề Where

  2. SQL Server:Lọc đầu ra của sp_who2

  3. Không thể kết nối với cơ sở dữ liệu SQLServer trong ứng dụng Java

  4. Cách tạo bảng Temp với SELECT * INTO tempTable FROM CTE Query

  5. Kết hợp hai bảng không có trường chung