📜  sql server 拆分字符串并插入到表中选择 - SQL (1)

📅  最后修改于: 2023-12-03 15:35:05.107000             🧑  作者: Mango

SQL Server 拆分字符串并插入到表中

在SQL Server中,我们可以使用一些方法来将一个包含多个值的字符串拆分并插入到表中。本文将探讨一些常见的方法和技巧。

1. 使用Split函数

我们可以自定义一个名为Split的函数来实现字符串拆分。

CREATE FUNCTION Split 
(   
    @InputString VARCHAR(MAX),
    @Delimiter VARCHAR(1)
)
RETURNS @Result TABLE 
(
    Item VARCHAR(MAX)
) 
AS
BEGIN
    DECLARE @StartIndex INT, @EndIndex INT

    SELECT @StartIndex = 1, @EndIndex = CHARINDEX(@Delimiter, @InputString)

    WHILE @StartIndex < LEN(@InputString) + 1
    BEGIN
        IF @EndIndex = 0 
            SET @EndIndex = LEN(@InputString) + 1

        INSERT INTO @Result(Item) 
        VALUES(SUBSTRING(@InputString, @StartIndex, @EndIndex - @StartIndex))

        SET @StartIndex = @EndIndex + 1
        SET @EndIndex = CHARINDEX(@Delimiter, @InputString, @StartIndex)
    END

    RETURN
END

上面的代码创建了一个名为Split的函数,它接受两个参数:要拆分的字符串和分隔符。该函数返回一个包含拆分后的每个值的表。

DECLARE @InputString VARCHAR(MAX) = 'red,green,blue,yellow'
DECLARE @Delimiter VARCHAR(1) = ','
SELECT * FROM dbo.Split(@InputString, @Delimiter)

上面的代码将拆分一个包含4个颜色值的字符串,并返回一个包含4行的表,每行包含一个颜色值。

2. 使用XML方法

我们还可以使用XML方法来实现字符串拆分。具体过程如下:

DECLARE @InputString VARCHAR(MAX) = 'red,green,blue,yellow'
DECLARE @Delimiter VARCHAR(1) = ','
SELECT 
    Item = Split.a.value('.', 'VARCHAR(100)')
FROM 
(
    SELECT 
        CAST('<M>'+REPLACE(@InputString, @Delimiter, '</M><M>')+'</M>' AS XML) AS Split
) t 
CROSS APPLY 
    Split.nodes('/M') AS Split(a)

上面的代码使用XML方法将字符串@InputString拆分为多个M元素,然后将这些M元素解析为单独的行并返回。每个行包含一个颜色值,保存在名为“Item”的列中。

3. 使用Substring和CharIndex函数

我们还可以使用Substring和CharIndex函数来实现字符串拆分。

DECLARE @InputString VARCHAR(MAX) = 'red,green,blue,yellow'
DECLARE @Delimiter VARCHAR(1) = ','

;WITH cte AS (
    SELECT 
        CAST(0 AS INT) AS StartIndex, 
        CHARINDEX(@Delimiter, @InputString) AS EndIndex
    UNION ALL
    SELECT 
        EndIndex + 1 AS StartIndex, 
        CHARINDEX(@Delimiter, @InputString, EndIndex + 1) AS EndIndex
    FROM 
        cte
    WHERE 
        EndIndex > 0
)
SELECT 
    Item = SUBSTRING(@InputString, StartIndex, CASE WHEN EndIndex > 0 THEN EndIndex - StartIndex ELSE 2147483647 END)
FROM 
    cte

上面的代码使用递归公用表表达式(CTE)来实现字符串拆分。CTE不断扫描字符串并使用Substring函数和CharIndex函数从中提取每个值。

4. 将拆分结果插入到表中

使用以上任何一种方法,我们最终都可以得到一个包含拆分结果的表。下面是一些示例代码,演示如何将这些结果插入到表中。

-- 使用Split函数拆分并插入
DECLARE @InputString VARCHAR(MAX) = 'red,green,blue,yellow'
DECLARE @Delimiter VARCHAR(1) = ','
INSERT INTO MyTable (Color) SELECT Item FROM dbo.Split(@InputString, @Delimiter)

-- 使用XML方法拆分并插入
DECLARE @InputString VARCHAR(MAX) = 'red,green,blue,yellow'
DECLARE @Delimiter VARCHAR(1) = ','
INSERT INTO MyTable (Color)
SELECT 
    Item = Split.a.value('.', 'VARCHAR(100)')
FROM 
(
    SELECT 
        CAST('<M>'+REPLACE(@InputString, @Delimiter, '</M><M>')+'</M>' AS XML) AS Split
) t 
CROSS APPLY 
    Split.nodes('/M') AS Split(a)

-- 使用Substring和CharIndex函数拆分并插入
DECLARE @InputString VARCHAR(MAX) = 'red,green,blue,yellow'
DECLARE @Delimiter VARCHAR(1) = ','
;WITH cte AS (
    SELECT 
        CAST(0 AS INT) AS StartIndex, 
        CHARINDEX(@Delimiter, @InputString) AS EndIndex
    UNION ALL
    SELECT 
        EndIndex + 1 AS StartIndex, 
        CHARINDEX(@Delimiter, @InputString, EndIndex + 1) AS EndIndex
    FROM 
        cte
    WHERE 
        EndIndex > 0
)
INSERT INTO MyTable (Color)
SELECT 
    Item = SUBSTRING(@InputString, StartIndex, CASE WHEN EndIndex > 0 THEN EndIndex - StartIndex ELSE 2147483647 END)
FROM 
    cte

上面的代码演示了如何将拆分结果插入到名为MyTable的表中。在这些示例中,我们将颜色值插入到一个名为“Color”的列中。

总结

本文介绍了几种常见的方法和技巧,用于将一个包含多个值的字符串拆分并插入到表中。这些方法中的每一种都有其自己的优缺点和注意事项,在实际使用时应根据具体情况进行选择。