Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Membagi fungsi di SQL Server 2008

Pertama, solusi terbaik Anda adalah tidak menyimpan data dalam daftar yang dipisahkan koma di database Anda. Anda harus mempertimbangkan untuk memperbaiki struktur tabel.

Jika Anda tidak dapat mengubah struktur tabel, maka Anda perlu membagi data dalam daftar ke baris untuk menetapkan nama yang benar. Setelah data dipisah, Anda dapat menggabungkan data kembali ke dalam daftar.

Ada banyak split fungsi yang dapat Anda temukan online tetapi ini adalah versi yang biasanya saya gunakan:

CREATE FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))       
returns @temptable TABLE (items varchar(MAX))       
as       
begin      
    declare @idx int       
    declare @slice varchar(8000)       

    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) values(@slice)       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return 
end;

Untuk mendapatkan hasil Anda, saya akan mulai dengan menerapkan split fungsi dan row_number() karena saya tidak melihat kunci unik yang terkait dengan setiap baris. Jika Anda memiliki kunci unik di setiap baris maka Anda tidak memerlukan row_number() :

;with cte as
(
  select rn, name, id
  from
  (
    select row_number() over(order by (select 1)) rn,
      databasename
    from table2
  ) t2
  cross apply dbo.split(t2.databasename, ',') i
  inner join table1 t1
    on i.items = t1.id
) 
select *
from cte

Kueri ini memecah daftar yang dipisahkan koma menjadi berikut ini:

| RN |   NAME | ID |
--------------------
|  1 |  MSSQL |  1 |
|  1 | Oracle |  3 |
|  2 |  MySQl |  2 |
|  3 |  MSSQL |  1 |
|  3 |  MySQl |  2 |

Setelah Anda memiliki data dalam beberapa baris dengan name yang benar , maka Anda dapat menggunakan STUFF() dan FOR XML PATH untuk menggabungkannya ke dalam daftar. Permintaan lengkap Anda akan mirip dengan ini:

;with cte as
(
  select rn, name, id
  from
  (
    select row_number() over(order by (select 1)) rn,
      databasename
    from table2
  ) t2
  cross apply dbo.split(t2.databasename, ',') i
  inner join table1 t1
    on i.items = t1.id
) 
select  
  STUFF(
         (SELECT ', ' + c2.name
          FROM cte c2
          where c1.rn = c2.rn
          order by c2.id
          FOR XML PATH (''))
          , 1, 1, '') Databasename
from cte c1
group by c1.rn
order by c1.rn;

Lihat SQL Fiddle dengan Demo.

Hasil query lengkapnya adalah:

|   DATABASENAME |
------------------
|  MSSQL, Oracle |
|          MySQl |
|   MSSQL, MySQl |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Peningkatan Layanan Broker di SQL Server 2016

  2. Cara Membuat Pernyataan Drop Table untuk semua tabel dalam database - Tutorial SQL Server / T-SQL Bagian 48

  3. TDS Server - Gunakan Pernyataan Transact-SQL (T-SQL) Untuk Bekerja Dengan Data Salesforce di SQL Server

  4. Bagaimana Fungsi STRING_ESCAPE() Bekerja di SQL Server (T-SQL)

  5. 4 Sumber Daya Pemantauan SQL Server yang Menakjubkan untuk Administrator Basis Data