Разделение и вставка строк в SQL Server: подробное руководство с примерами

В SQL Server работа со строками — обычная задача, и существуют различные сценарии, когда вам может потребоваться разделить строку и вставить разделенные значения в таблицу. В этой статье вы познакомитесь с несколькими методами, используя разговорный язык, и предоставите примеры кода для достижения этой цели. Давайте погрузимся!

Метод 1: использование функции STRING_SPLIT
Функция STRING_SPLIT, представленная в SQL Server 2016, — это простой и понятный способ разбить строку на строки.

CREATE TABLE #TempTable (Value VARCHAR(100))
INSERT INTO #TempTable
SELECT value FROM STRING_SPLIT('John,Doe,Jane,Smith', ',')

Метод 2: использование метода XML
Альтернативный метод включает преобразование строки в формат XML и последующее извлечение значений с помощью метода nodes().

DECLARE @xml XML
SET @xml = '<root><item>' + REPLACE('John,Doe,Jane,Smith', ',', '</item><item>') + '</item></root>'
CREATE TABLE #TempTable (Value VARCHAR(100))
INSERT INTO #TempTable
SELECT T.c.value('.', 'VARCHAR(100)') AS Value
FROM @xml.nodes('/root/item') AS T(c)

Метод 3: использование рекурсивного CTE (общего табличного выражения)
Рекурсивный CTE – это мощный метод, позволяющий рекурсивно разбивать строку до тех пор, пока не будут извлечены все значения.

DECLARE @String VARCHAR(MAX) = 'John,Doe,Jane,Smith'
CREATE TABLE #TempTable (Value VARCHAR(100))
;WITH SplitCTE AS (
    SELECT LEFT(@String, CHARINDEX(',', @String + ',') - 1) AS Value,
           RIGHT(@String, LEN(@String) - CHARINDEX(',', @String)) AS Remaining
    UNION ALL
    SELECT LEFT(Remaining, CHARINDEX(',', Remaining + ',') - 1),
           RIGHT(Remaining, LEN(Remaining) - CHARINDEX(',', Remaining))
    FROM SplitCTE
    WHERE LEN(Remaining) > 0
)
INSERT INTO #TempTable
SELECT Value FROM SplitCTE
OPTION (MAXRECURSION 0)

Метод 4. Использование пользовательской функции разделения.
Если вы предпочитаете подход с возможностью повторного использования, вы можете создать пользовательскую функцию (UDF), чтобы разделить строку и вставить значения в таблицу.

CREATE FUNCTION dbo.SplitString
(
    @String VARCHAR(MAX),
    @Delimiter CHAR(1)
)
RETURNS @SplitTable TABLE (Value VARCHAR(100))
AS
BEGIN
    DECLARE @Value VARCHAR(100)
    WHILE CHARINDEX(@Delimiter, @String) > 0
    BEGIN
        SET @Value = SUBSTRING(@String, 1, CHARINDEX(@Delimiter, @String) - 1)
        INSERT INTO @SplitTable (Value) VALUES (@Value)
        SET @String = SUBSTRING(@String, CHARINDEX(@Delimiter, @String) + 1, LEN(@String))
    END
    IF LEN(@String) > 0
        INSERT INTO @SplitTable (Value) VALUES (@String)
    RETURN
END
CREATE TABLE #TempTable (Value VARCHAR(100))
INSERT INTO #TempTable
SELECT Value FROM dbo.SplitString('John,Doe,Jane,Smith', ',')

В этой статье мы рассмотрели несколько методов разделения строки и вставки значений в таблицу SQL Server. Мы рассмотрели функцию STRING_SPLIT, метод XML, рекурсивный CTE и пользовательскую функцию разделения. Каждый метод имеет свои преимущества и может быть использован в зависимости от ваших конкретных требований. Используя эти методы, вы можете эффективно управлять строковыми данными в своей базе данных и манипулировать ими.