Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 强制转换后,“类型在锚和递归部分之间不匹配”_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 强制转换后,“类型在锚和递归部分之间不匹配”

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

在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
    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如果列是用特定排序规则声明的,则更明显。。。荣誉