Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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 2008 R2 - Fatal编程技术网

在Sql Server中拆分大字符串

在Sql Server中拆分大字符串,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我使用这个逻辑来分割字符串查询 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

我使用这个逻辑来分割字符串查询

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) = '&'
只返回10条记录

如何拆分大字符串,原因是什么?为什么子字符串不能处理大字符串?

您可以使用函数。它返回一个基于输入字符串和delimeter的拆分值表

用法:

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)

我使用了这个函数,它对我来说非常有用:)

创建函数f_split(@SourceSql nvarchar(Max),@stresprate varchar(10))
返回@temp
表([列]nvarchar(最大值))
开始
声明@i int
设置@SourceSql=rtrim(ltrim(@SourceSql))
设置@i=charindex(@stresprate,@SourceSql)
而@i>=1
开始
插入@temp值(左(@SourceSql,@i-1))
设置@SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
设置@i=charindex(@stresprate,@SourceSql)
结束
如果@SourceSql'\'
插入@temp值(@SourceSql)
返回
结束
去
从dbo.f_split中选择*('1,2,3,4,5',',')
去

我不确定为什么您的代码没有得到结果。我使用大量数据执行了查询。但是我得到了结果。可能是你的绳子比我测试的要大得多。我也有同样的要求分裂字符串。我使用这个函数来得到解决方案。你可以试试这个

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
创建函数[dbo].[fnSplitString](@MyArray VARCHAR(8000),@separator CHAR(1))
返回@RetTable表
(标准值VARCHAR(256))
作为
开始
声明@separatorstring VARCHAR(10);
设置@separatorString='%'+@separator+'%
声明@separator\u位置INT
声明@array_value VARCHAR(1000)
设置@MyArray=@MyArray+@分隔符
而PATINDEX(@separatorstring,@MyArray)0
开始
选择@separator\u position=PATINDEX(@separatorstring,@MyArray)
选择@array\u value=LEFT(@MyArray,@separator\u位置-1)
插入@RetTable值(强制转换(@array_值为VARCHAR(256)))
选择@MyArray=STUFF(@MyArray,1,@separator\u position',)
结束
返回
结束


如果您想了解有关此函数的更多说明、函数的使用方式以及参数,可以查看。这是一个非常简单且易于使用的函数。

字符串长度是否超过2048个字符?(
master..spt_values
有2048行,其中
Type='P'
。如果字符串长度超过2048个字符,则可以忽略其余部分。)@it初学者:是的,我只希望按符号拆分,并且它非常大string@EdHarper:它可能大于2048,那么如何拆分大字符串一个典型的解决方案是使用
行编号()
函数生成
编号的顺序值,将
spt\u值
交叉连接到自身。看见这个问题的答案提供了其他几种解决方案。
 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
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