Рекурсивный CTE с uniqueidentifier должен иметь значение в привязке - PullRequest
1 голос
/ 19 декабря 2011
;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

Так что эта функция выдаст ошибку: «Типы не совпадают между якорем и рекурсивной частью в столбце« SomeId »рекурсивного запроса« Компании »». Я знаю, что могу исправить это, просто заменив «NULL AS SomeId» на «CAST (NULL AS uniqueidentifier)». Но почему якорь должен знать, что это уникальный идентификатор, когда parentCompanyId не должен знать, что это int? Это потому, что uniqueidentifier - это объект, а int - это тип значения?

1 Ответ

3 голосов
/ 19 декабря 2011

NULL по умолчанию считается int, поэтому вам не нужно явно разыгрывать его.

Это можно увидеть по

SELECT NULL AS FOO INTO BAR;

SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME='FOO'AND TABLE_NAME='BAR';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...