如何解决 - 传递给LEFT或SUBSTRING函数

时间:2015-05-13 11:00:07

标签: sql sql-server sql-server-2008

这是我的分割功能:

CREATE FUNCTION [dbo].[Split2]
(
    @String NVARCHAR(4000),
    @Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
    WITH Split(stpos,endpos)
    AS
    (
        SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos

        UNION ALL

        SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
        FROM Split
        WHERE endpos > 0
    )
    SELECT
        'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
        'Data' =  SUBSTRING(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos),1,CHARINDEX('$',SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos))-1),
        'UserId' =  SUBSTRING(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos),CHARINDEX('$',SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos))+1,LEN(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)))
    FROM Split
)

...我尝试运行此查询:

Declare @String1 nvarchar(max);

SET @String1 = '1$1,0$1,2$2,1$2,0$2,3$3,1$3,0$3,4$4,3$4'

SELECT data, UserId 
FROM dbo.Split2(@String1, ',')
OPTION (maxrecursion 0)

它运行正常,但是当我传递超过4000个字符时,我收到此错误

  

传递给LEFT或SUBSTRING函数的长度参数无效。

然后我试着改变

@String NVARCHAR(4000)
分割函数中的

nvarchar(max);

然后显示

  

允许的最大值(4000)。

我如何实现这一点,我们非常感谢任何想法。我想要分割长度超过10000或20000个字符的字符串。

2 个答案:

答案 0 :(得分:1)

@String参数类型更改为NVARCHAR(max),并在第一个bigint中向{0}的SELECT添加显式广播,因为CHARINDEX返回

  

bigint 如果expressionToSearch是varchar(max),nvarchar(max)或者   varbinary(max)数据类型;否则, int

CREATE FUNCTION [dbo].[Split2]
(
    @String NVARCHAR(max),
    @Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
    WITH Split(stpos,endpos)
    AS
    (
        SELECT CAST(0 AS bigint) AS stpos, CHARINDEX(@Delimiter,@String) AS endpos

        UNION ALL

        SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
        FROM Split
        WHERE endpos > 0
    )
    SELECT
        'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
        'Data' =  SUBSTRING(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos),1,CHARINDEX('$',SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos))-1),
        'UserId' =  SUBSTRING(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos),CHARINDEX('$',SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos))+1,LEN(SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)))
    FROM Split
)

答案 1 :(得分:0)

SQL Server字符串限制为4000个Unicode字符,例如NVARCHAR(MAX)。这是你的错误的原因。

您可以将其更改为非Unicode,并且您将获得8000 VARCHAR(MAX)。

获取更多信息需要您以某种方式控制代码运行时字符串的大小。我不完全清楚它是如何工作的,所以我无法进一步修改它。