虽然我找到了这个问题各个部分的答案,但我发布这个是因为我没有找到将这些整合到一个解决方案中的答案。以为我会发布我的解决方案,以防其他人有同样的问题。
这是我的第一篇文章,我是 SQL-Server 的新手,因此非常感谢任何评论或建议。
下面的函数返回
1) 一个表,每行对应一个字符串,
2) 如果 string 为空或 null,则返回一个空表,并且
3) 如果 delimiter 为 null 或为空,则返回包含字符串的单行表。
我把它做成通用的,所以我可以用它把 CSV 分成几行。
用法
@Delimiter:用于确定在何处拆分字符串以放置在表行中的值
@Remove_Delimiters:确定@Delimiter 是否保留在放置在表行中的字符串中
@String:要拆分并放入表格行的字符串。
将字符串拆分为行:设置@Delimiter CHAR(13)+CHAR(10)
将字符串拆分为 CSV 值:设置 @Delimiter ','
注意:删除额外空白所需的另一个功能
CREATE FUNCTION [dbo].[QaAuto_STRING_2TABLE]
(
@Remove_Delimiters BIT
, @Delimiter NVARCHAR(4000)
, @String NVARCHAR(4000)
)
RETURNS @Table TABLE
(
Row INT NOT NULL
, Value NVARCHAR(MAX)
)
AS
BEGIN
IF NOT (@String IS NULL OR @String = '')
BEGIN
WITH Cte AS
(
SELECT StartIndex = 0, EndIndex = 1
UNION ALL
SELECT EndIndex ,CHARINDEX(@Delimiter, @String, EndIndex) + LEN(@Delimiter)
FROM Cte WHERE EndIndex > StartIndex
)
INSERT INTO @Table SELECT
Row = ROW_NUMBER() OVER(ORDER BY(SELECT 1))
,Value =
CASE
WHEN @Delimiter IS NULL OR @Delimiter = '' THEN @String
ELSE SUBSTRING(@String, StartIndex,
CASE
WHEN EndIndex > LEN(@Delimiter)
THEN EndIndex-StartIndex - (LEN(@Delimiter)*@Remove_Delimiters)
ELSE LEN(@String) - StartIndex + LEN(@Delimiter)
END)
END
FROM Cte
WHERE StartIndex > 0
END
RETURN
END