Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字符串SQL Server解析列表_Sql_Sql Server_Function_Parsing - Fatal编程技术网

从字符串SQL Server解析列表

从字符串SQL Server解析列表,sql,sql-server,function,parsing,Sql,Sql Server,Function,Parsing,我一直在使用这个函数来解析字符串列表;有没有更有效的方法 这是为了分析具有多个值的字符串 这就是我使用函数的方式 select * from dbo.fn_getlistfromstring(''1,3,2,46,Mums the Order,bb'') 功能代码: CREATE FUNCTION [dbo].[fn_getlistfromstring] (@string NVARCHAR(4000), @separator NVARCHAR(50)) RETURNS

我一直在使用这个函数来解析字符串列表;有没有更有效的方法

这是为了分析具有多个值的字符串

这就是我使用函数的方式

select * 
from dbo.fn_getlistfromstring(''1,3,2,46,Mums the Order,bb'')
功能代码:

CREATE FUNCTION [dbo].[fn_getlistfromstring]
     (@string NVARCHAR(4000), 
      @separator NVARCHAR(50))
RETURNS @list TABLE
              (value NVARCHAR(200) collate database_default)
AS
BEGIN
    DECLARE @working NVARCHAR(4000), @value NVARCHAR(150)
    DECLARE @startpos INT, @endpos INT, @len INT, @seplen INT

    IF LTRIM(RTRIM(ISNULL(@string, ''))) <> '' 
    BEGIN
        SET @seplen = LEN(@separator)
        SET @working = LTRIM(RTRIM(ISNULL(@string, '')))

        IF CHARINDEX(@separator, @working, 1) <> 0 
        BEGIN
            SET @len = LEN(@working)
            SET @startpos = 1
      set @endpos = 1
      set @value = ''
      while @endpos < @len and @startpos < @len
        begin
        set @endpos = charindex(@separator, @working,@startpos)
        if @endpos = 0
          set @endpos = @len + 1
        set @value = ltrim(rtrim(substring( @working, @startpos, (@endpos - @startpos))))
        INSERT into @list (value) values (@value)
        set @startpos = @endpos + @seplen
        end
      end
    else -- only one
      INSERT into @list (value) values (@working)
    end

 RETURN 
END


GO
创建函数[dbo]。[fn\u getlistfromstring]
(@string NVARCHAR(4000),
@分离器(50))
返回@list表
(值NVARCHAR(200)collate database_默认值)
作为
开始
声明@working-NVARCHAR(4000),@value-NVARCHAR(150)
声明@startpos INT、@endpos INT、@len INT、@seplen INT
如果LTRIM(RTRIM(ISNULL(@string,))“”
开始
设置@seplen=LEN(@separator)
设置@working=LTRIM(RTRIM(ISNULL(@string,'))
如果CHARINDEX(@separator,@working,1)0
开始
设置@len=len(@working)
设置@startpos=1
设置@endpos=1
设置@value=''
而@endpos<@len和@startpos<@len
开始
设置@endpos=charindex(@separator、@working、@startpos)
如果@endpos=0
设置@endpos=@len+1
设置@value=ltrim(rtrim(子字符串(@working,@startpos,(@endpos-@startpos)))
插入@list(value)值(@value)
设置@startpos=@endpos+@seplen
结束
结束
除此之外,只有一个
插入@list(value)值(@working)
结束
返回
结束
去

是的,有更好的方法。例如,一台SQL Server 2016+存在
STRING\u SPLIT
。您还可以使用
进行XML路径
、Jeff Moden的
DelmimitedSplit8K
以及许多其他答案。这是一个非常常见的问题;因此,我建议先在您喜欢的搜索引擎上进行搜索……)除了@Larnu的优点之外,别忘了CLR,它的性能将超过所有基于SQL的方法。CLR肯定会更快,但如果您使用tsql解决方案,它不应该有任何循环或递归CTE。“解析”用于更复杂的转换。如果您搜索“拆分”,那么您会发现这个问题已经被回答了好几次。感谢您的快速回复和2016+技巧,因为我们将在几个月后切换到该版本。我不知道搜索时怎么会错过杰夫·摩登的帖子!