如何创建表函数,该函数返回字符串每行的行,如果string为null或为空,则返回空表

时间:2014-04-24 21:08:30

标签: sql sql-server sql-server-2008 table-functions

虽然我找到了这个问题的各个部分的答案,但我发布这个是因为我没有找到将这些整合到一个解决方案中的答案。以为我会发布我的解决方案以防其他人有同样的问题。

这是我的第一篇文章,我是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

0 个答案:

没有答案