虽然我找到了这个问题的各个部分的答案,但我发布这个是因为我没有找到将这些整合到一个解决方案中的答案。以为我会发布我的解决方案以防其他人有同样的问题。
这是我的第一篇文章,我是SQL-Server的新手,所以任何评论或建议都非常感谢。
以下功能返回
1)一个表,其中包含字符串每行的行
2)如果string为空或null,则返回一个空表,并
3)如果分隔符为null或为空,则返回包含字符串的单行表。
我把它变成了通用的,所以我可以用它来将CSV制成行。
USAGE
@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