我编写了一个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个字符的字符串。
答案 0 :(得分:2)
CHARINDEX()
与BIGINT
而不是VARCHAR(MAX)
一起使用时会返回INT
,因此您需要的锚类型也是BIGINT
:
;with cte as (
select cast(0 as bigint) a, cast(1 as bigint) b