Sql 强制转换后,“类型在锚和递归部分之间不匹配”
在SQL Server存储过程中,此CTE正在运行。问题的总结是,查询没有显式强制转换,但即使添加了它们,SQL Server仍然会抛出: 递归查询ABC的FName列中的锚点和递归部分之间的类型不匹配 我尝试了几种类型的强制转换,例如使用varchar8000和将CASE语句包装到强制转换表达式中Sql 强制转换后,“类型在锚和递归部分之间不匹配”,sql,sql-server,tsql,Sql,Sql Server,Tsql,在SQL Server存储过程中,此CTE正在运行。问题的总结是,查询没有显式强制转换,但即使添加了它们,SQL Server仍然会抛出: 递归查询ABC的FName列中的锚点和递归部分之间的类型不匹配 我尝试了几种类型的强制转换,例如使用varchar8000和将CASE语句包装到强制转换表达式中 ;WITH ABC (FId, FName) AS ( SELECT cast(1 as int), CAST('' AS varchar(max)) UNION ALL S
;WITH ABC (FId, FName) AS
(
SELECT cast(1 as int), CAST('' AS varchar(max))
UNION ALL
SELECT
cast(B.FId + 1 as int),
CASE WHEN LEN(B.FName) > 0
THEN cast((B.FName + ':' + A.FName) as varchar(max))
ELSE cast(A.FName as varchar(max))
END
FROM (
SELECT
Row_Number() OVER (ORDER BY FId) AS RN,
FName
FROM #T1
) A
INNER JOIN ABC B ON A.RN = B.FId AND A.RN <= 5
)
具有上下文的可执行文件:
CREATE TABLE #T1
(
FId INT
, FName VARCHAR(max)
)
INSERT INTO #T1 VALUES
(1, '5 Oct 2020'),
(2, '12 Oct 2020'),
(3, '19 Oct 2020'),
(4, '26 Oct 2020'),
(5, '2 Nov 2020'),
(6, '9 Nov 2020'),
(7, '16 Nov 2020'),
(8, '23 Nov 2020'),
(9, '30 Nov 2020'),
(10,'7 Dec 2020'),
(11,'14 Dec 2020')
;WITH ABC (FId, FName) AS
(
SELECT cast(1 as int), CAST('' AS varchar(max))
UNION ALL
SELECT
cast(B.FId + 1 as int),
CASE WHEN LEN(B.FName) > 0
THEN cast((B.FName + ':' + A.FName) as varchar(max))
ELSE cast(A.FName as varchar(max))
END
FROM (
SELECT
Row_Number() OVER (ORDER BY FId) AS RN,
FName
FROM #T1
) A
INNER JOIN ABC B ON A.RN = B.FId AND A.RN <= 5
) SELECT * FROM ABC
对于递归CTE,键入非常挑剔,尤其是字符串 不同行为的原因似乎是服务器和列的默认排序规则不同 试着沿着这条路走:
;WITH ABC (FId, FName) AS
(
SELECT cast(1 as int), CAST('' AS varchar(max)) COLLATE DATABASE_DEFAULT
UNION ALL
SELECT
cast(B.FId + 1 as int),
CAST(CASE WHEN LEN(B.FName) > 0
THEN B.FName + ':' + A.FName
ELSE A.FName END as varchar(max)) COLLATE DATABASE_DEFAULT --I use one cast for the whole CASE expression
FROM (
SELECT
Row_Number() OVER (ORDER BY FId) AS RN,
FName
FROM #T1
) A
INNER JOIN ABC B ON A.RN = B.FId AND A.RN <= 5
) SELECT * FROM ABC
A将帮助我们帮助您。@Larnu我马上添加它。谢谢。您提供的SQL不会复制此问题。我们需要一个满足复制部分的排序规则。那么您是说数据库的默认排序规则不同于tempDb的默认排序规则?@shnugo如果列是用特定排序规则声明的,则更明显。。。荣誉