从字符串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+技巧,因为我们将在几个月后切换到该版本。我不知道搜索时怎么会错过杰夫·摩登的帖子!