2 Stimmen

Rekursive CTE mit eindeutigem Bezeichner muss Wert in einem Anker haben

;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

Daher wird diese Funktion einen Fehler ausgeben: "Typen stimmen nicht überein zwischen dem Anker und dem rekursiven Teil in der Spalte "SomeId" der rekursiven Abfrage "Firmen"". Ich weiß, dass ich das Problem beheben kann, indem ich einfach "NULL AS SomeId" durch "CAST(NULL AS uniqueidentifier)" ersetze. Aber warum muss der Anker wissen, dass es sich um einen uniqueidentifier handelt, wenn die parentCompanyId nicht wissen muss, dass es sich um eine int handelt? Liegt es daran, dass ein Uniqueidentifier ein Objekt ist und int ein Wertetyp?

4voto

Martin Smith Punkte 417623

NULL wird standardmäßig angenommen, dass es sich um eine int Deshalb müssen Sie das nicht ausdrücklich machen.

Sie können dies sehen aus

SELECT NULL AS FOO INTO BAR;

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X