我正在使用此逻辑拆分字符串查询
declare @query nvarchar(max)
set @query = '1&2&3&4&5&6&7&8&9&10&11&12&13&14'
SELECT SUBSTRING('&' + @query + '&', Number + 1, -- is used to split the '@query' on the basis of '&' sign
CHARINDEX('&', '&' + @query + '&', Number + 1) - Number -1)AS VALUE
FROM master..spt_values
WHERE Type = 'P'
AND Number <= LEN('&' + @query + '&') - 1
AND SUBSTRING('&' + @query + '&', Number, 1) = '&'
当查询很小时它工作正常,但是当@query的值非常大时,它给我的结果更少
例如。
@query = 'very large string containing 60 & sign '
只返回10条记录
如何分割大字符串,原因是什么?为什么SUBSTRING
无法处理大字符串?
答案 0 :(得分:0)
您可以使用this功能。它返回一个基于输入字符串和分隔符的分割值表。
用法:
select *
from dbo.fn_ParseText2Table('1&2&3&4&5&6&7&8&9&10&11&12&13&14','&')
该函数有一个参数@p_SourceText
,其类型为varchar(8000)
,因此输入字符串最多可包含8000个字符。
如果您的SQL Server版本允许您执行此操作,则可以将类型更改为varchar(max)
。
答案 1 :(得分:0)
我使用了这个功能,它完美地为我工作:)
CREATE function f_split(@SourceSql nvarchar(Max),@StrSeprate varchar(10))
returns @temp
table([column] nvarchar(Max))
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>'\'
insert @temp values(@SourceSql)
return
end
go
select * from dbo.f_split('1,2,3,4,5',',')
go
答案 2 :(得分:0)
我不确定为什么你的代码没有得到结果。我用大量数据执行查询。但我得到了结果。可能是你的字符串比我测试的要大得多。我也有相同的要求拆分字符串。我正在使用此功能来获得解决方案。你可以试试这个。
CREATE FUNCTION [dbo].[fnSplitString] ( @MyArray VARCHAR(8000), @separator CHAR(1) )
RETURNS @RetTable TABLE
(StrValue VARCHAR(256))
AS
BEGIN
DECLARE @SeperatorString VARCHAR(10);
SET @SeperatorString = '%' + @separator + '%'
DECLARE @separator_position INT
DECLARE @array_value VARCHAR(1000)
SET @MyArray = @MyArray + @separator
WHILE PATINDEX( @SeperatorString , @MyArray) <> 0
BEGIN
SELECT @separator_position = PATINDEX(@SeperatorString , @MyArray)
SELECT @array_value = LEFT(@MyArray, @separator_position - 1)
INSERT @RetTable VALUES ( CAST(@array_value AS VARCHAR(256)) )
SELECT @MyArray = STUFF(@MyArray, 1, @separator_position, '')
END
RETURN
END
如果您想要更多关于此功能的说明,功能如何使用以及参数是什么,您可以查看here.。这是非常简单的功能,易于使用。