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:
- Konversi string yang dibatasi menjadi XML, gunakan XQuery untuk memisahkan string, dan simpan ke dalam tabel.
- Buat fungsi bernilai tabel yang ditentukan pengguna untuk membagi string dan memasukkannya ke dalam tabel.
- 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:
- 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)
- 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=','
- 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:
- Pendekatan berbeda untuk memisahkan dan menyisipkan string yang dibatasi dalam tabel.
- Tingkat tinggi adalah ringkasan fungsi STRING_SPLIT.
- Pisahkan dan sisipkan string yang dibatasi menggunakan XML dan XQuery.
- Pisahkan dan sisipkan string yang dibatasi menggunakan fungsi bernilai tabel yang ditentukan pengguna.