使用特殊字符的开始和结束索引创建临时 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
我有特殊字符为“|”的字符串
DECLARE @string NVARCHAR(MAX) = Column1,True,3|Column2,True,2|Column3,True,6;
DECLARE @columns AS TABLE(Clm VARCHAR(50));
要求:从上面的字符串
创建一个临时文件tableColumn1
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