この記事では、区切られた文字列を分割してSQLServerのテーブルの列に挿入するいくつかの方法を示します。次の方法を使用してそれを行うことができます:
- 区切り文字列をXMLに変換し、XQueryを使用して文字列を分割し、テーブルに保存します。
- 文字列を分割してテーブルに挿入するためのユーザー定義のテーブル値関数を作成します。
- STRING_SPLIT関数を使用して文字列を分割し、出力をテーブルに挿入します。
上記の方法を示すために、デモのセットアップを準備します。まず、従業員という名前のテーブルを作成しましょう DemoDatabase 。そのためには、次のクエリを実行する必要があります。
USE DEMODATABASE GO CREATE TABLE EMPLOYEE ( ID INT IDENTITY (1, 1), EMPLOYEE_NAME VARCHAR(MAX) )
このデモでは、すべての従業員の名前を1行に挿入し、従業員の名前をコンマで区切ります。そのためには、次のクエリを実行する必要があります。
INSERT INTO EMPLOYEE (EMPLOYEE_NAME) VALUES ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA')
次のクエリを実行して、データが列に挿入されていることを確認します。
SELECT * FROM EMPLOYEE
出力は次のとおりです。
上で述べたように、区切られた文字列を分割してテーブルに挿入します。そこで、 Employee_Detailという名前のテーブルを作成します 上記の方法のいずれかによって分割された区切り文字列を格納します。
テーブルを作成するには、次のコードを実行します。
USE DEMODATABASE GO CREATE TABLE EMPLOYEE_DETAIL ( ID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED, EMPNAME VARCHAR(MAX) NOT NULL )
方法1:STRING_SPLIT関数を使用して区切り文字列を分割する
STRING_SPLITを使用します 文字列を列に分割してテーブルに挿入する関数。その前に、 STRING_SPLITについて説明します。 機能。
STRING_SPLIT関数とは
STRING_SPLITは、SQL Server 2016で導入されたテーブル値関数です。この関数は、行内の特殊文字に基づいて文字列を分割し、出力を別のテーブルに返します。この関数は、互換性レベルが130以上のデータベースで使用できます。
STRING_SPLIT関数は、2つのパラメーターを受け入れ、分離された値を持つテーブルを返します。 STRING_SPLIT関数の構文は次のとおりです。
SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)
上記の構文では、SPECIALCHARACTERは、入力文字列を区切るために使用される1文字です。
以下は、STRING_SPLIT関数の簡単な例です。
DECLARE @STRING VARCHAR(MAX) DECLARE @SPECIALCHARACTER CHAR(1) SET @STRING='NISARG,NIRALI,RAMESH,SURESH' SELECT * FROM STRING_SPLIT (@STRING, ',')
クエリの出力は次のとおりです。
上記の例でわかるように、 STRING_SPLITによって返される出力列の名前 は「価値」です。 「value」列のWHERE句を使用して関数から返される出力をフィルタリングできます。また、 ORDER BYを使用して出力の順序を並べ替えることもできます。 「値」列の句。
以下は例です。
次に、区切り文字列をテーブルに挿入するために、次のタスクを実行します。
- @EmployeeNameという名前の変数を作成します 、従業員の出力を保持します テーブル。これを行うには、次のコードを実行します。
DECLARE @EMPLOYEENAME VARCHAR(MAX) SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME FROM EMPLOYEE)
- @Separatorという別の変数を作成します charデータ型の。この変数は、文字列を複数の値に分割するために使用されるセパレーターの値を保持します。変数を作成して値をセパレーターに割り当てるには、次のコードを実行します。
DECLARE @SEPARATOR CHAR(1) SET @SEPARATOR=','
- 「STRING_SPLIT」を使用します 」関数を使用して、 employee_nameの値を分割します 従業員の列 テーブルを作成し、値を EMPLOYEENAMEに挿入します テーブル。これを行うには、次のコードを実行します。
INSERT INTO EMPLOYEE_DETAIL (EMPNAME) SELECT * FROM STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)
スクリプト全体は次のとおりです。
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)
上記のスクリプトを実行します。スクリプトはテーブルに9行を挿入します。実行したら、データが EMPLOYEENAMEに挿入されていることを確認してください テーブル。このために、次のクエリを実行します。
SELECT * FROM EMPLOYEE_DETAIL
出力は次のとおりです。
方法2:XMLを使用して文字列を分割し、出力をテーブルに挿入します
区切られた文字列を分割する場合は、テーブル値関数を使用して分割できます。ご存知のように、ユーザー定義のテーブル値関数はリソースを大量に消費するため、避ける必要があります。そのような場合、利用できるオプションは多くありません。前述したように、 STRING_SPLIT 関数は、互換性レベルが130以上のデータベースに使用できます。このような状況では、区切られた文字列を分割する方法を見つけるのは困難です。このタスクのためのシンプルで効率的なソリューションを作成しました。 XMLを使用して文字列を分割できます。
したがって、このセクションでは、分割された区切り文字列を列のさまざまな行に挿入するために使用できるXMLのコードについて説明します。
コード全体を3つのステップに分割しました。
ステップ1 :区切られた文字列をXML形式に変換します。これを行うには、次のコードを実行します。
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
出力は次のとおりです。
XML文字列全体を表示するには、上の画像に示すようにセルをクリックします。セルをクリックすると、XMLファイルは次のようになります。
<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>
ステップ2 :文字列がXMLに変換されたら、X-Queryを使用してXMLファイルをクエリします。これを行うには、次のコードを実行します。
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)
出力は次のとおりです。
ステップ3 :上記で実行したクエリによって生成された出力を Employee_Detailに挿入します テーブル。これを行うには、次のコードを実行します。
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) */
データが挿入されたら、次のスクリプトを実行して、データが挿入されたことを確認します。次のクエリを実行します:
USE DEMODATABASE GO SELECT * FROM EMPLOYEE_DETAIL
以下は出力です。
方法3:テーブル値関数を使用して文字列を分割し、関数の出力をテーブルに挿入します
このアプローチは従来のものであり、SQLServerのすべてのバージョンとエディションでサポートされています。このアプローチでは、whileループとCHARINDEXおよびSUBSTRING関数を使用するユーザー定義のテーブル値関数を作成します。
関数を作成するためのコードは次のとおりです。
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
関数が作成されたら、次のクエリを実行してクエリを分割し、出力を Employee_Detailに挿入します。 テーブル。
DECLARE @SQLQUERY NVARCHAR(MAX) SET @SQLQUERY=(SELECT EMPLOYEE_NAME FROM EMPLOYEE) INSERT INTO EMPLOYEE_DETAIL SELECT * FROM SPLIT_DELIMITED_STRING(@SQLQUERY, ',')
データがテーブルに挿入されたら、次のクエリを実行して、データが正しく挿入されていることを確認します
概要
この記事では、以下について説明しました:
- 区切り文字列を分割してテーブルに挿入するためのさまざまなアプローチ。
- 高レベルはSTRING_SPLIT関数の要約です。
- XMLとXQueryを使用して区切り文字列を分割して挿入します。
- ユーザー定義のテーブル値関数を使用して、区切られた文字列を分割して挿入します。