sql - 具有 uniqueidentifier 的递归 CTE 必须在 anchor 中具有值

标签 sql sql-server-2008 t-sql

;WITH Companies(pkCompanyID,name,parentCompanyID,SomeId) AS

        (
            SELECT
                tblCompany.pkCompanyID,
                tblCompany.name,
                NULL,--this is a int with no value and it works in the anchor
                NULL AS SomeId--But this uniqueidentifier do not work why?
            FROM
                tblCompany
            WHERE
                tblCompany.fkCompToCompID IS NULL
            UNION ALL
            SELECT
                tblCompany.pkCompanyID,
                tblCompany.name,
                tblCompany.fkCompToCompID,
                NEWID()
            FROM
                tblCompany
                JOIN Companies ON tblCompany.fkCompToCompID=Companies.pkCompanyID
        )
        SELECT
            *
        FROM
            Companies

因此该函数将给出错误:“ anchor 与递归查询“Companies”的列“SomeId”中的递归部分之间的类型不匹配”。我知道我可以通过将“NULL AS SomeId”替换为“CAST(NULL AS uniqueidentifier)”来修复它。但是为什么当parentCompanyId不需要知道它是一个int时,anchor需要知道它是一个uniqueidentifier呢?是因为uniqueidentifier是对象而int是值类型吗?

最佳答案

NULL 默认情况下被假定为 int,这就是为什么您不必显式转换该类型。

您可以从

看到这一点
SELECT NULL AS FOO INTO BAR;

SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME='FOO'AND TABLE_NAME='BAR';

关于sql - 具有 uniqueidentifier 的递归 CTE 必须在 anchor 中具有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8562670/

相关文章:

sql - 如何从具有不同 where 子句的表中两次获得 sum() ?

sql - PL/SQL 查找并让行重复

sql - 使用同一 select 语句中的 N 动态选择前 N 个

sql - SQL 中日期时间字段的时间部分

sql-server-2008 - 从当前数据库中的另一个数据库运行存储过程

sql-server - 从另一个存储过程计算一个存储过程的结果的最有效方法是什么?

sql-server - 当条件与新插入的记录匹配时,T-Sql MERGE 语句更新

mysql - 选择查询算术计算

java - 如何将类型化查询转换为条件生成器对象?

mysql - MSSQL 使用分隔符分割字符串