Sql server SQL Server中的自定义拆分函数

Sql server SQL Server中的自定义拆分函数,sql-server,function,Sql Server,Function,我试图在SQL Server中创建一个拆分函数,该函数拆分字符串并为我提供第n个子字符串,但我没有足够的SQL经验来实现它 理想情况下,我想写作 选择拆分选择“级别a:级别b:级别c:级别d',':',3 它将返回c级 部分答案就在这里 但我无法将其转换为我想要的功能。使用StringSplit函数,但必须是sql server 2016或更高版本 字符串\拆分字符串、分隔符 从字符串中选择*拆分“约翰,杰里米,杰克”,“我想这就是你想要的 create FUNCTION dbo.SplitAr

我试图在SQL Server中创建一个拆分函数,该函数拆分字符串并为我提供第n个子字符串,但我没有足够的SQL经验来实现它

理想情况下,我想写作

选择拆分选择“级别a:级别b:级别c:级别d',':',3 它将返回c级

部分答案就在这里


但我无法将其转换为我想要的功能。

使用StringSplit函数,但必须是sql server 2016或更高版本 字符串\拆分字符串、分隔符
从字符串中选择*拆分“约翰,杰里米,杰克”,“我想这就是你想要的

create FUNCTION dbo.SplitArrayIndex
(
  @InputString NVARCHAR(MAX) ,
  @Delimiter VARCHAR(50) ,
  @index INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @ret NVARCHAR(MAX)
    DECLARE @Items TABLE
        (
          id INT IDENTITY(1, 1) ,
          Item NVARCHAR(MAX)
        )

    IF @Delimiter = ' '
        BEGIN
            SET @Delimiter = ','
            SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
        END

    IF ( @Delimiter IS NULL
         OR @Delimiter = ''
       )
        SET @Delimiter = ','


    DECLARE @Item NVARCHAR(MAX)
    DECLARE @ItemList NVARCHAR(MAX)
    DECLARE @DelimIndex INT

    SET @ItemList = @InputString
    SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
    WHILE ( @DelimIndex != 0 )
        BEGIN
            SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
            INSERT  INTO @Items
            VALUES  ( @Item )

        -- Set @ItemList = @ItemList minus one less item
            SET @ItemList = SUBSTRING(@ItemList, @DelimIndex + 1,
                                      LEN(@ItemList) - @DelimIndex)
            SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
        END -- End WHILE

    IF @Item IS NOT NULL -- At least one delimiter was encountered in 
    @InputString
        BEGIN
            SET @Item = @ItemList
            INSERT  INTO @Items
            VALUES  ( @Item )
        END

  -- No delimiters were encountered in @InputString, so just return 
  @InputString
    ELSE
        INSERT  INTO @Items
        VALUES  ( @InputString )


    SELECT TOP 1
            @ret = Item
    FROM    @Items
    WHERE   id = @index
    RETURN @ret

END -- End Function

我想这就是你想要的 速度与SQL内置/系统函数STRING\u SPLIT函数相同

如果对象ID为'[dbo].[fnVRS_字符串\u拆分]',则'IF'为空 EXEC'CREATE FUNCTION[dbo].[fnVRS\u STRING\u SPLIT]将表格返回为返回选择1 X' 终止 去 ALTER函数[dbo]。[fnVRS\u字符串\u拆分] @字符串nvarcharMAX, @分离器nvarcharMAX 返回带有SCHEMABINDING的表 作为回报 在XN为的情况下,从值0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 TC中选择“表1”, YN AS从X A1、X A2、X A3、X A4、X A5、X A6、X A7、X A8中选择“表2”,最多16^8=40亿 TN作为选择TOPISNULLLEN@string,通过从Y中选择NULL-1 N,订单上的行数为0, DelimPos AS从t中选择t.N,其中SUBSTRING@string,t.N,LEN@separator+“x'-1类似于分隔符或t.N=0, Separatedvalue作为SELECTSUBSTRING@string,d.位置+LEN@separator+“x'-1,前置位置,12147483647通过选择空-前置位置-LEN@separator 从德利姆d 其中@string不为NULL 选择s.value 从分离的 其中s.value@分隔符 去
这无法获取第n项,因为内置字符串拆分的结果是一个没有索引列的表,这意味着您只能获得一组未排序的子字符串。这可能是SQL Server中拆分字符串的最糟糕方法。阅读Aaron Betrand的文章了解更多信息。一段时间是一个糟糕的解决方案。分割字符串有更好的方法,例如XML分割器、计数分割器、CLR函数、JSON字符串分割器和内置的字符串分割函数。@ZoharPeled说,作为一个选项,暂时是一个漫长的过程。我仍然不喜欢这篇文章的某些部分,因为关于杰夫·摩登的拆分器的信息并不是一个真正的比较。他的Jeff's splitter故意不支持MAX数据类型,但本文中所有关于它的比较都使用了经过修改的MAX版本;导致性能大大降低。@Larnu Jeff和Aaron在本文的评论中详细讨论了这一点。我同意使用varchar8000比使用varcharmax要快得多,但这仍然是我所知道的关于SQL Server字符串拆分器性能比较的文章中最好的一篇……我知道他们是这样做的,@ZoharPeled;如果Aaron使用MAX和non-MAX版本重新访问它,那就太好了。人们不经常阅读评论,因此会使用实际上不正确的信息。我推荐。但是,老实说,我建议您修复您的设计。我建议您完全在SQL Server之外进行修复。字符串操作不是SQL Server的强项。这不是它设计的目的。如果您真的必须在SQL中执行此操作,我认为基于XML/Json的解决方案可能是此提示的最佳选择:您可能根本不需要拆分字符串