Trong bài viết này, tôi sẽ trình bày một số cách để tách chuỗi được phân tách và chèn nó vào một cột của bảng trong SQL Server. Bạn có thể làm điều đó bằng các phương pháp sau:
- Chuyển đổi chuỗi được phân tách thành XML, sử dụng XQuery để chia chuỗi và lưu vào bảng.
- Tạo một hàm có giá trị bảng do người dùng xác định để tách chuỗi và chèn vào bảng.
- Tách chuỗi bằng hàm STRING_SPLIT và chèn đầu ra vào bảng.
Để chứng minh các phương pháp trên, hãy để tôi chuẩn bị thiết lập demo. Trước tiên, chúng ta hãy tạo một bảng có tên Nhân viên trên DemoDatabase . Để làm điều đó, chúng ta cần thực hiện truy vấn sau:
USE DEMODATABASE GO CREATE TABLE EMPLOYEE ( ID INT IDENTITY (1, 1), EMPLOYEE_NAME VARCHAR(MAX) )
Đối với bản demo này, chúng tôi sẽ chèn tên của tất cả nhân viên vào một hàng và tên của các nhân viên sẽ được phân tách bằng dấu phẩy. Để làm điều đó, chúng ta cần thực hiện truy vấn sau:
INSERT INTO EMPLOYEE (EMPLOYEE_NAME) VALUES ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA')
Thực thi truy vấn sau để xác minh rằng dữ liệu đã được chèn vào cột.
SELECT * FROM EMPLOYEE
Sau đây là kết quả:
Như tôi đã đề cập ở trên, chúng ta sẽ chia chuỗi được phân tách và chèn nó vào một bảng. Vì vậy, chúng tôi sẽ tạo một bảng có tên Employee_Detail để lưu trữ chuỗi phân tách được phân tách bằng bất kỳ phương pháp nào ở trên.
Để tạo bảng, hãy thực thi đoạn mã sau:
USE DEMODATABASE GO CREATE TABLE EMPLOYEE_DETAIL ( ID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED, EMPNAME VARCHAR(MAX) NOT NULL )
Phương pháp 1:Sử dụng Hàm STRING_SPLIT để tách chuỗi phân cách
Chúng tôi sẽ sử dụng STRING_SPLIT hàm tách chuỗi trong cột và chèn vào bảng. Trước khi chúng tôi làm điều đó, hãy để tôi giải thích về STRING_SPLIT chức năng.
Hàm STRING_SPLIT là gì
STRING_SPLIT là một hàm giá trị bảng, được giới thiệu trong SQL Server 2016. Hàm này tách chuỗi dựa trên ký tự đặc biệt trong hàng và trả về kết quả trong một bảng riêng biệt. Chúng tôi có thể sử dụng chức năng này trên các cơ sở dữ liệu có mức độ tương thích bằng hoặc cao hơn 130.
Hàm STRING_SPLIT chấp nhận hai tham số và trả về một bảng có các giá trị được phân tách. Sau đây là cú pháp của hàm STRING_SPLIT.
SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)
Trong cú pháp trên, ĐẶC BIỆT là một ký tự sẽ được sử dụng để phân tách chuỗi đầu vào.
Sau đây là một ví dụ đơn giản về hàm STRING_SPLIT.
DECLARE @STRING VARCHAR(MAX) DECLARE @SPECIALCHARACTER CHAR(1) SET @STRING='NISARG,NIRALI,RAMESH,SURESH' SELECT * FROM STRING_SPLIT (@STRING, ',')
Sau đây là kết quả đầu ra của truy vấn:
Như bạn có thể thấy trong ví dụ trên, tên của cột đầu ra được trả về bởi STRING_SPLIT là "giá trị". Chúng tôi có thể lọc đầu ra được trả về bởi hàm bằng mệnh đề WHERE trên cột “giá trị” và ngoài ra, chúng tôi có thể sắp xếp thứ tự đầu ra bằng cách sử dụng ORDER BY trên cột "giá trị".
Sau đây là một ví dụ.
Bây giờ để chèn một chuỗi được phân tách vào một bảng, chúng ta sẽ thực hiện các tác vụ sau:
- Tạo một biến có tên @EpriseeName , giữ đầu ra của Nhân viên bàn. Để làm điều đó, hãy thực thi mã sau:
DECLARE @EMPLOYEENAME VARCHAR(MAX) SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME FROM EMPLOYEE)
- Tạo một biến khác có tên là @ Dấu phân tách của kiểu dữ liệu char. Biến này giữ giá trị của dấu phân tách, giá trị này sẽ được sử dụng để chia chuỗi thành nhiều giá trị. Để tạo biến và gán giá trị cho dấu phân tách, hãy thực thi đoạn mã sau:
DECLARE @SEPARATOR CHAR(1) SET @SEPARATOR=','
- Bây giờ, hãy sử dụng “ STRING_SPLIT ”Để phân chia các giá trị của tên_người_việc cột Nhân viên và chèn các giá trị vào EMPLOYEENAME bàn. Để làm điều đó, hãy thực thi mã sau:
INSERT INTO EMPLOYEE_DETAIL (EMPNAME) SELECT * FROM STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)
Sau đây là toàn bộ tập lệnh:
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)
Thực thi script trên. Tập lệnh sẽ chèn chín hàng vào bảng. Sau khi bạn thực thi, hãy đảm bảo dữ liệu đã được chèn vào EMPLOYEENAME bàn. Đối với điều này, hãy thực hiện truy vấn sau:
SELECT * FROM EMPLOYEE_DETAIL
Sau đây là kết quả:
Phương pháp 2:Tách chuỗi bằng XML và chèn đầu ra trong bảng
Khi chúng ta muốn chia chuỗi được phân tách, chúng ta có thể thực hiện việc đó bằng cách sử dụng các hàm có giá trị bảng. Như chúng ta đã biết, các hàm có giá trị bảng do người dùng xác định là tốn nhiều tài nguyên và nên tránh. Trong những trường hợp như vậy, chúng tôi không có sẵn nhiều lựa chọn. Như tôi đã đề cập, STRING_SPLIT có thể được sử dụng cho các cơ sở dữ liệu có mức độ tương thích lớn hơn hoặc bằng 130. Trong những trường hợp như vậy, rất khó để tìm cách tách một chuỗi phân tách. Chúng tôi đã tạo ra một giải pháp đơn giản và hiệu quả cho nhiệm vụ này. Chúng tôi có thể tách chuỗi bằng cách sử dụng XML.
Vì vậy, trong phần này, tôi sẽ giải thích mã của XML có thể được sử dụng để chèn chuỗi phân tách tách biệt trong các hàng khác nhau của cột.
Tôi đã chia toàn bộ mã thành ba bước.
Bước 1 :Chuyển đổi chuỗi phân tách thành Định dạng XML. Để làm điều đó, hãy thực thi đoạn mã sau:
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
Sau đây là kết quả:
Để xem toàn bộ chuỗi XML, hãy nhấp vào ô như được hiển thị trên hình trên. Khi bạn nhấp vào ô, tệp XML sẽ trông giống như sau:
<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>
Bước 2 :Sau khi chuỗi được chuyển đổi thành XML, hãy sử dụng X-Query để truy vấn tệp XML. Để làm điều đó, hãy thực thi đoạn mã sau:
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)
Sau đây là kết quả:
Bước 3 :Chèn kết quả được tạo bởi truy vấn được thực thi ở trên vào Employee_Detail bàn. Để làm điều đó, hãy thực thi đoạn mã sau:
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) */
Sau khi dữ liệu được chèn, hãy thực thi tập lệnh sau để xác minh rằng dữ liệu đã được chèn. Thực hiện truy vấn sau:
USE DEMODATABASE GO SELECT * FROM EMPLOYEE_DETAIL
Sau đây là kết quả đầu ra.
Phương pháp 3:Tách chuỗi bằng hàm định trị trong bảng và chèn đầu ra của hàm trong bảng
Cách tiếp cận này là truyền thống và được hỗ trợ trong tất cả các phiên bản và phiên bản của SQL Server. Trong cách tiếp cận này, chúng tôi sẽ tạo một hàm giá trị bảng do người dùng xác định sẽ sử dụng vòng lặp while và hàm CHARINDEX và hàm SUBSTRING.
Sau đây là mã để tạo một hàm:
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
Khi hàm được tạo, hãy thực thi truy vấn sau để tách truy vấn và chèn đầu ra vào Employee_Detail bảng.
DECLARE @SQLQUERY NVARCHAR(MAX) SET @SQLQUERY=(SELECT EMPLOYEE_NAME FROM EMPLOYEE) INSERT INTO EMPLOYEE_DETAIL SELECT * FROM SPLIT_DELIMITED_STRING(@SQLQUERY, ',')
Sau khi dữ liệu được chèn vào bảng, hãy thực hiện truy vấn sau để xác minh rằng dữ liệu đã được chèn đúng cách
Tóm tắt
Trong bài viết này, tôi đã đề cập đến:
- Cách tiếp cận khác nhau để tách và chèn chuỗi phân tách trong bảng.
- Mức cao là bản tóm tắt của hàm STRING_SPLIT.
- Tách và chèn một chuỗi được phân tách bằng XML và XQuery.
- Tách và chèn chuỗi phân tách bằng cách sử dụng một hàm giá trị bảng do người dùng xác định.