SQL Server CTE error: Types don't match between the anchor and the recursive part

SQL Server CTE error: Types don't match between the anchor and the recursive part

我写了一个 CTE 代码,将分隔字符串(分隔符可以是任何东西)解析为 table。所以“MI,TX,WI”将被解析为具有 3 行的 table。

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

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

如果您更改您收到此错误的注释,则此方法有效:

Types don't match between the anchor and the recursive part in column "b" of recursive query "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 个字符的字符串。

CHARINDEX() returns a BIGINT 当与 VARCHAR(MAX) 而不是 INT 一起使用时,所以你需要锚点类型也是 BIGINT:

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