Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Beberapa Cara Menyisipkan Split Delimited Strings dalam Kolom

Pada artikel ini, saya akan mendemonstrasikan beberapa cara untuk memisahkan string yang dibatasi dan memasukkannya ke dalam kolom tabel di SQL Server. Anda dapat melakukannya dengan menggunakan metode berikut:

  1. Konversi string yang dibatasi menjadi XML, gunakan XQuery untuk memisahkan string, dan simpan ke dalam tabel.
  2. Buat fungsi bernilai tabel yang ditentukan pengguna untuk membagi string dan memasukkannya ke dalam tabel.
  3. Pisahkan string menggunakan fungsi STRING_SPLIT dan masukkan output ke dalam tabel.

Untuk mendemonstrasikan metode di atas, izinkan saya menyiapkan demo setup. Pertama, mari kita buat tabel bernama Karyawan di DemoDatabase . Untuk melakukan itu, kita perlu menjalankan kueri berikut:

USE DEMODATABASE 
GO 

CREATE TABLE EMPLOYEE 
  ( 
     ID            INT IDENTITY (1, 1), 
     EMPLOYEE_NAME VARCHAR(MAX) 
  )

Untuk demo ini, kami akan memasukkan nama semua karyawan dalam satu baris dan nama karyawan akan dipisahkan dengan koma. Untuk melakukan itu, kita perlu menjalankan kueri berikut:

INSERT INTO EMPLOYEE 
            (EMPLOYEE_NAME) 
VALUES      ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA')

Jalankan kueri berikut untuk memverifikasi bahwa data telah dimasukkan ke dalam kolom.

SELECT * 
FROM   EMPLOYEE

Berikut adalah outputnya:

Seperti yang saya sebutkan di atas, kita akan membagi string yang dibatasi dan memasukkannya ke dalam tabel. Jadi, kita akan membuat tabel bernama Employee_Detail untuk menyimpan pemisahan string yang dipisahkan oleh salah satu metode di atas.

Untuk membuat tabel, jalankan kode berikut:

USE DEMODATABASE 
GO 
CREATE TABLE EMPLOYEE_DETAIL 
  ( 
     ID      INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED, 
     EMPNAME VARCHAR(MAX) NOT NULL 
  )

Metode 1:Gunakan Fungsi STRING_SPLIT untuk Memisahkan String yang Dibatasi

Kami akan menggunakan STRING_SPLIT berfungsi untuk membagi string dalam kolom dan memasukkannya ke dalam tabel. Sebelum kita melakukannya, izinkan saya menjelaskan tentang STRING_SPLIT fungsi.

Apa itu Fungsi STRING_SPLIT

STRING_SPLIT adalah fungsi bernilai tabel, diperkenalkan di SQL Server 2016. Fungsi ini membagi string berdasarkan karakter khusus di dalam baris dan mengembalikan output dalam tabel terpisah. Kita dapat menggunakan fungsi ini pada database yang memiliki tingkat kompatibilitas sama atau lebih tinggi dari 130.

Fungsi STRING_SPLIT menerima dua parameter dan mengembalikan tabel dengan nilai yang dipisahkan. Berikut ini adalah sintaks dari fungsi STRING_SPLIT.

SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)

Dalam sintaks di atas, SPECIALCHARACTER adalah salah satu karakter yang akan digunakan untuk memisahkan string input.

Berikut ini adalah contoh sederhana dari fungsi STRING_SPLIT.

DECLARE @STRING VARCHAR(MAX) 
DECLARE @SPECIALCHARACTER CHAR(1) 
SET @STRING='NISARG,NIRALI,RAMESH,SURESH' 
SELECT * 
FROM   STRING_SPLIT (@STRING, ',')

Berikut ini adalah output dari query:

Seperti yang Anda lihat pada contoh di atas, nama kolom keluaran dikembalikan oleh STRING_SPLIT adalah "nilai". Kita dapat memfilter output yang dikembalikan oleh fungsi menggunakan klausa WHERE pada kolom “nilai” dan juga, kita dapat mengurutkan urutan output menggunakan ORDER BY klausa pada kolom “nilai”.

Berikut ini contohnya.

Sekarang untuk memasukkan string yang dibatasi ke dalam tabel, kita akan melakukan tugas-tugas berikut:

  1. Buat variabel bernama @NamaKaryawan , yang menampung keluaran Karyawan meja. Untuk melakukannya, jalankan kode berikut:
    DECLARE @EMPLOYEENAME VARCHAR(MAX) 
    SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME 
                        FROM   EMPLOYEE)
  2. Buat variabel lain bernama @Separator dari tipe data char. Variabel ini menyimpan nilai pemisah, yang akan digunakan untuk membagi string menjadi beberapa nilai. Untuk membuat variabel dan menetapkan nilai ke pemisah, jalankan kode berikut:
    DECLARE @SEPARATOR CHAR(1) 
    SET @SEPARATOR=','
  3. Sekarang gunakan "STRING_SPLIT ” berfungsi untuk membagi nilai employee_name kolom Karyawan tabel dan masukkan nilainya ke dalam EMPLOYEENAME meja. Untuk melakukannya, jalankan kode berikut:
    INSERT INTO EMPLOYEE_DETAIL 
                (EMPNAME) 
    SELECT * 
    FROM   STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)

Berikut script selengkapnya:

DECLARE @EMPLOYEENAME VARCHAR(MAX) 

SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME 
                    FROM   EMPLOYEE) 
DECLARE @SEPARATOR CHAR(1) 
SET @SEPARATOR=',' 
INSERT INTO EMPLOYEE_DETAIL 
            (EMPNAME) 
SELECT * 
FROM   STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)

Jalankan skrip di atas. Script akan memasukkan sembilan baris ke dalam tabel. Setelah Anda menjalankannya, pastikan data telah dimasukkan ke dalam NAMA KARYAWAN meja. Untuk ini, jalankan kueri berikut:

SELECT * 
FROM   EMPLOYEE_DETAIL

Berikut adalah outputnya:

Metode 2:Pisahkan string menggunakan XML dan masukkan output ke dalam tabel

Saat kita ingin memisahkan string yang dibatasi, kita bisa melakukannya menggunakan fungsi bernilai tabel. Seperti yang kita ketahui, fungsi bernilai tabel yang ditentukan pengguna membutuhkan banyak sumber daya dan harus dihindari. Dalam kasus seperti itu, kami tidak memiliki banyak pilihan yang tersedia. Seperti yang saya sebutkan, STRING_SPLIT fungsi dapat digunakan untuk database yang memiliki tingkat kompatibilitas lebih besar dari atau sama dengan 130. Dalam keadaan seperti itu, sulit untuk menemukan cara untuk memisahkan string yang dibatasi. Kami telah menciptakan solusi sederhana dan efisien untuk tugas ini. Kita dapat membagi string menggunakan XML.

Jadi, di bagian ini, saya akan menjelaskan kode XML yang dapat digunakan untuk menyisipkan string delimited split di baris kolom yang berbeda.

Saya telah membagi seluruh kode menjadi tiga langkah.

Langkah 1 :Mengonversi string yang dibatasi ke dalam Format XML. Untuk melakukannya, jalankan kode berikut:

USE demodatabase 
go 

DECLARE @xml       AS XML, 
        @QueryData AS VARCHAR(max), 
        @delimiter AS VARCHAR(10) 

SET @QueryData=(SELECT employee_name 
                FROM   employee) 
SET @delimiter =',' 
SET @xml = Cast(( '<EMPNAME>' 
                  + Replace(@QueryData, @delimiter, '</EMPNAME><EMPNAME>') 
                  + '</EMPNAME>' ) AS XML) 

SELECT @XML

Berikut adalah outputnya:

Untuk melihat seluruh string XML, klik sel seperti yang ditunjukkan pada gambar di atas. Setelah Anda mengklik sel, file XML akan terlihat seperti berikut:

<EMPNAME>DULCE </EMPNAME>
<EMPNAME> MARA </EMPNAME>
<EMPNAME> PHILIP </EMPNAME>
<EMPNAME> KATHLEEN</EMPNAME>
<EMPNAME> NEREIDA </EMPNAME>
<EMPNAME> GASTON </EMPNAME>
<EMPNAME> ETTA </EMPNAME>
<EMPNAME> EARLEAN </EMPNAME>
<EMPNAME> VINCENZA</EMPNAME>

Langkah 2 :Setelah string diubah menjadi XML, gunakan X-Query untuk menanyakan file XML. Untuk melakukannya, jalankan kode berikut:

USE DEMODATABASE 
GO 

DECLARE @XML       AS XML, 
        @STR       AS VARCHAR(MAX), 
        @DELIMITER AS VARCHAR(10) 

SET @STR=(SELECT EMPLOYEE_NAME 
          FROM   EMPLOYEE) 
SET @DELIMITER =',' 
SET @XML = CAST(( '<EMPNAME>' 
                  + REPLACE(@STR, @DELIMITER, '</EMPNAME><EMPNAME>') 
                  + '</EMPNAME>' ) AS XML) 

SELECT N.VALUE('.', 'VARCHAR(10)') AS VALUE 
FROM   @XML.NODES('EMPNAME') AS T(N)

Berikut adalah outputnya:

Langkah 3 :Masukkan output yang dihasilkan oleh kueri yang dieksekusi di atas ke dalam Employee_Detail meja. Untuk melakukannya, jalankan kode berikut:

USE DEMODATABASE
GO
DECLARE @XML AS XML,@STR AS VARCHAR(MAX),@DELIMITER AS VARCHAR(10)
SET @STR=(SELECT EMPLOYEE_NAME FROM EMPLOYEE)
SET @DELIMITER =','
SET @XML = CAST(('<EMPNAME>'+REPLACE(@STR,@DELIMITER ,'</EMPNAME><EMPNAME>')+'</EMPNAME>') AS XML)
INSERT INTO EMPLOYEE_DETAIL (EMPNAME)
SELECT N.VALUE('.', 'VARCHAR(10)') AS VALUE FROM @XML.NODES('EMPNAME') AS T(N)
/*Output
 (9 rows affected)
 */

Setelah data dimasukkan, jalankan skrip berikut untuk memverifikasi bahwa data telah dimasukkan. Jalankan kueri berikut:

USE DEMODATABASE 
GO 
SELECT * 
FROM   EMPLOYEE_DETAIL

Berikut adalah outputnya.

Metode 3:Pisahkan string menggunakan fungsi bernilai tabel dan masukkan output fungsi ke dalam tabel

Pendekatan ini tradisional, dan didukung di semua versi dan edisi SQL Server. Dalam pendekatan ini, kita akan membuat fungsi bernilai tabel yang ditentukan pengguna yang akan menggunakan while loop dan fungsi CHARINDEX dan SUBSTRING.

Berikut ini adalah kode untuk membuat fungsi:

REATE FUNCTION [DBO].SPLIT_DELIMITED_STRING (@SQLQUERY  VARCHAR(MAX), 
                                              @DELIMITOR CHAR(1)) 
RETURNS @RESULT TABLE( 
  VALUE VARCHAR(MAX)) 
AS 
  BEGIN 
      DECLARE @DELIMITORPOSITION INT = CHARINDEX(@DELIMITOR, @SQLQUERY), 
              @VALUE             VARCHAR(MAX), 
              @STARTPOSITION     INT = 1 

      IF @DELIMITORPOSITION = 0 
        BEGIN 
            INSERT INTO @RESULT 
            VALUES     (@SQLQUERY) 

            RETURN 
        END 

      SET @SQLQUERY = @SQLQUERY + @DELIMITOR 

      WHILE @DELIMITORPOSITION > 0 
        BEGIN 
            SET @VALUE = SUBSTRING(@SQLQUERY, @STARTPOSITION, 
                         @DELIMITORPOSITION - @STARTPOSITION) 

            IF( @VALUE <> '' ) 
              INSERT INTO @RESULT 
              VALUES     (@VALUE) 

            SET @STARTPOSITION = @DELIMITORPOSITION + 1 
            SET @DELIMITORPOSITION = CHARINDEX(@DELIMITOR, @SQLQUERY, 
                                     @STARTPOSITION) 
        END 

      RETURN 
  END

Setelah fungsi dibuat, jalankan kueri berikut untuk membagi kueri dan masukkan output ke dalam Employee_Detail tabel.

DECLARE @SQLQUERY NVARCHAR(MAX) 
SET @SQLQUERY=(SELECT EMPLOYEE_NAME 
               FROM   EMPLOYEE) 
INSERT INTO EMPLOYEE_DETAIL 
SELECT * 
FROM   SPLIT_DELIMITED_STRING(@SQLQUERY, ',')

Setelah data dimasukkan ke dalam tabel, jalankan kueri berikut untuk memverifikasi bahwa data telah dimasukkan dengan benar

Ringkasan

Dalam artikel ini, saya telah membahas:

  1. Pendekatan berbeda untuk memisahkan dan menyisipkan string yang dibatasi dalam tabel.
  2. Tingkat tinggi adalah ringkasan fungsi STRING_SPLIT.
  3. Pisahkan dan sisipkan string yang dibatasi menggunakan XML dan XQuery.
  4. Pisahkan dan sisipkan string yang dibatasi menggunakan fungsi bernilai tabel yang ditentukan pengguna.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Beberapa masalah kecil dengan sampel Hekaton

  2. Analisis Big Data dengan Microsoft Azure Tools

  3. Memangkas Lemak Log Transaksi

  4. Relasional vs basis data non-relasional - Part 3

  5. MuleSoft Merangkul GraphQL untuk Memajukan Integrasi API