SQL Server CTE错误:类型不会在锚点和递归部分之间匹配

时间:2016-02-04 20:52:17

标签: sql sql-server parsing common-table-expression

我编写了一个CTE代码,用于解析分隔的字符串(分隔符可以是其他)到表中。所以" MI,TX,WI"将被解析为一个包含3行的表。

只要我不使用NVARCHAR(MAX)作为我要解析的字符串输入,它就可以工作。

我想知道如何让它与NVARCHAR(MAX)(或至少VARCHAR(MAX)一起使用?

如果您更改了此错误,则此工作除了评论:

  

类型不在锚和列中的递归部分之间匹配   " B"递归查询" cte"。

--- change this to NVARCHAR(MAX) and it fails
DECLARE @DelimitedString NVARCHAR(4000) 
DECLARE @Delimiter NVARCHAR(10) 
SET @Delimiter = '--'

SET @DelimitedString= '123--456--7890, 234--456--7890'

-- do here instead of in every loop below
DECLARE @DelimiterLength AS TINYINT
SET @DelimiterLength = len(@Delimiter) 

;with cte as 
( 
    select 0 a, 1 b  
    union all 
    select b, charindex(@Delimiter, @DelimitedString, b) + len(@Delimiter)      
    from cte where b > a 
)   
select LTRIM(RTRIM(
    SUBSTRING(@DelimitedString, 
        a,                  
        case when b > @DelimiterLength then b-a-@DelimiterLength else len(@DelimitedString) - a + 1 end
    )--END SUBSTRING
))--end LTRIM/RTRIM
value         
from cte where a > 0 

我理解错误在标准中的含义,UNION数据类型中的列必须匹配。我不知道如何解决这个问题。

我希望它可以使用我们需要的长字符串,因为我不知道用法是否会限制为4000个字符的字符串。

1 个答案:

答案 0 :(得分:2)

CHARINDEX()BIGINT而不是VARCHAR(MAX)一起使用时会返回INT,因此您需要的锚类型也是BIGINT

;with cte as ( 
    select cast(0 as bigint) a, cast(1 as bigint) b