Sql server 如何根据字符组合拆分字符串?

Sql server 如何根据字符组合拆分字符串?,sql-server,tsql,Sql Server,Tsql,我有这个字符串: “你好,我叫#!”!乔斯佩!“。我希望输出为Jospeh。 假设我有这个字符串: “你好,我叫#!”!约瑟夫!国王。我希望我的输出为“Joseph”和“King” 我创建了一个函数: ALTER FUNCTION [dbo].[TfSplitTemplateVariable] ( @String NVARCHAR(4000) , @Delimiter NCHAR(2) ) RETURNS TABLE AS RETURN (

我有这个字符串:

“你好,我叫#!”!乔斯佩!“。我希望输出为Jospeh。

假设我有这个字符串:

“你好,我叫#!”!约瑟夫!国王。我希望我的输出为“Joseph”和“King”

我创建了一个函数:

ALTER FUNCTION [dbo].[TfSplitTemplateVariable]
    (
      @String NVARCHAR(4000) ,
      @Delimiter NCHAR(2)
    )
RETURNS TABLE
AS
RETURN
    (
    WITH    Split ( stpos, endpos )
              AS ( SELECT   0 AS stpos ,
                            CHARINDEX(@Delimiter, @String) AS endpos
                   UNION ALL
                   SELECT   endpos + 1 ,
                            CHARINDEX(@Delimiter, @String, endpos + 1)
                   FROM     Split
                   WHERE    endpos > 0
                 )
    SELECT  'Id' = ROW_NUMBER() OVER ( ORDER BY ( SELECT    1
                                                ) ) ,
            'Data' = SUBSTRING(@String, stpos,
                               COALESCE(NULLIF(endpos, 0), LEN(@String) + 1)
                               - stpos)
    FROM    Split
)
GO
当我运行这个时:

SELECT tstv.* FROM dbo.TfSplitTemplateVariable('Hello my Name is #!Jospeh#!','#!') AS tstv  WHERE   ID % 2 = 0 
我得到输出
!乔斯佩

我做错了什么

选择endpos+1
更改为
选择endpos+LEN(@Delimiter)

我希望此代码符合您的需要:

ALTER FUNCTION [dbo].[TfSplitTemplateVariable]
    (
      @String NVARCHAR(MAX),
      @Delimiter NVARCHAR(2)
    )
RETURNS @result TABLE (Id INT IDENTITY PRIMARY KEY, Data NVARCHAR (MAX))
AS
BEGIN
    DECLARE @start INT, @end INT
    SET @start = 1

    WHILE CHARINDEX(@Delimiter, @String, @start) > 0
    BEGIN
        SET @start  = CHARINDEX(@Delimiter, @String, @start) + LEN(@Delimiter)
        SET @end    = CHARINDEX(@Delimiter, @String, @start)

        IF @end > @start
        BEGIN
            INSERT @result(Data) VALUES(SUBSTRING(@String, @start, @end - @start))
        END
        ELSE
        BEGIN
            BREAK
        END

        SET @start = @end + LEN(@Delimiter)
    END

    RETURN
END
GO

您可能想阅读这篇由Dwain Camps撰写的文章:与其将代码硬编码为2,不如将其设置为
SELECT endpos+LEN(@Delimiter)