使用特殊字符的开始和结束索引创建临时 table

Create temp table with start and end index of a special char

我有特殊字符为“|”的字符串

DECLARE @string NVARCHAR(MAX) = Column1,True,3|Column2,True,2|Column3,True,6;

DECLARE @columns AS TABLE(Clm VARCHAR(50));

要求:从上面的字符串

创建一个临时文件table
Column1
Column2
Column3

我的做法:

WITH columns AS 
(
    SELECT
        CAST(0 AS BIGINT) AS idx1, 
        CHARINDEX('|', @string) idx2

    UNION ALL

    SELECT 
        idx2 + 1, CHARINDEX('|', @string, idx2 + 1)
    FROM
        columns  
    WHERE 
        idx2 > 0
)
INSERT INTO @column
    SELECT
        LEFT(SUBSTRING(@string, idx1, COALESCE(NULLIF(idx2, 0), LEN(@string) + 1) - idx1,
                       CHARINDEX(',', SUBSTRING(@string, idx1, COALESCE(NULLIF(idx2,0), LEN(@string) + 1) - idx1)) - 1) AS value
    FROM 
        columns;

我能够实现所需的功能,但遇到性能问题。生产需要 30 秒。

请帮助我更好的方法。

一个选项是进行两次拆分,但实际上只需要一次,因为第二次拆分只需要第一个值。

所以我们可以在 | 上拆分,然后搜索第一个 ,

DECLARE @string NVARCHAR(MAX) = N'Column1,True,3|Column2,True,2|Column3,True,6';

DECLARE @columns AS TABLE(Clm VARCHAR(50));

INSERT INTO @column (Clm)
    SELECT
        CASE WHEN v1.comma > 0
          THEN LEFT(split.[value], v1.comma - 1)
          ELSE split.[value]
        END
    FROM STRING_SPLIT(@string, '|') split
    CROSS APPLY (VALUES (CHARINDEX(',', split.[value]) ) ) v1(comma);

您至少需要 SQL Server 2017 才能使用 STRING_SPLIT