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
我写了一个 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