SQL Server CTE错误:类型为don';锚和递归部分之间不匹配

SQL Server CTE错误:类型为don';锚和递归部分之间不匹配,sql,sql-server,parsing,common-table-expression,Sql,Sql Server,Parsing,Common Table Expression,我编写了一个CTE代码,它将分隔字符串(分隔符可以是任何东西)解析到一个表中。因此“MI,TX,WI”将被解析为一个包含3行的表 只要我不使用NVARCHAR(MAX)作为要解析的字符串输入,它就可以工作 我想知道如何让它与NVARCHAR(MAX)(或者至少是VARCHAR(MAX))一起工作 如果您更改您收到此错误,则除注释外,此操作有效: 列中的锚点和递归部分之间的类型不匹配 递归查询“cte”的“b” 我理解这个错误在标准中的含义,UNION数据类型中的列必须匹配。我不知道如何解决这个问

我编写了一个CTE代码,它将分隔字符串(分隔符可以是任何东西)解析到一个表中。因此“
MI,TX,WI
”将被解析为一个包含3行的表

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

我想知道如何让它与
NVARCHAR(MAX)
(或者至少是
VARCHAR(MAX)
)一起工作

如果您更改您收到此错误,则除注释外,此操作有效:

列中的锚点和递归部分之间的类型不匹配 递归查询“cte”的“b”

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

我希望它能够处理我们需要的字符串长度,因为我不知道使用是否限制为4000个字符的字符串。

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

;with cte as ( 
    select cast(0 as bigint) a, cast(1 as bigint) b  
CHARINDEX()
VARCHAR(MAX)
一起使用时,返回一个
BIGINT
,而不是
INT
,因此您需要锚类型也为
BIGINT

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

尝试在cte的上半部分将b转换为
int
。有一些比cte更好的分割字符串的方法。这里有一整篇文章专门讨论各种分割器以及它们在性能方面的叠加方式。无需在这里重新发明轮子。尝试在cte的上半部分将b转换为
int
。有一些更好的分割方法这里有一整篇文章专门讨论各种拆分器以及它们如何在性能方面进行叠加。这里不需要重新设计轮子。