0

我正在使用这个逻辑来拆分字符串查询

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不能处理大字符串?

4

3 回答 3

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
于 2013-05-22T08:17:20.943 回答
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

结尾

如果你想了解更多关于这个函数的解释,函数是如何使用的以及参数是什么,你可以看看这里。. 这是一个非常简单且易于使用的功能。

于 2013-09-19T13:32:15.830 回答
0

您可以使用功能。它根据输入字符串和分隔符返回一个拆分值表。

用法:

select * 
from dbo.fn_ParseText2Table('1&2&3&4&5&6&7&8&9&10&11&12&13&14','&')

该函数有一个@p_SourceText类型为的参数varchar(8000),因此输入字符串最多可包含 8000 个字符。

varchar(max)如果您的 SQL Server 版本允许您执行此操作,您可以将类型更改为。

于 2013-05-22T07:57:21.190 回答