webentwicklung-frage-antwort-db.com.de

CREATE VIEW muss die einzige Anweisung im Stapel sein

Ich versuche, eine Ansicht zu machen. Bisher habe ich folgendes geschrieben:

with ExpAndCheapMedicine(MostMoney, MinMoney) as
(
    select max(unitprice), min(unitprice)
    from Medicine
)
,
findmostexpensive(nameOfExpensive) as
(
    select tradename
    from Medicine, ExpAndCheapMedicine
    where UnitPrice = MostMoney
)
,
findCheapest(nameOfCheapest) as
(
    select tradename
    from Medicine, ExpAndCheapMedicine
    where UnitPrice = MinMoney
)

CREATE VIEW showing
as
select tradename, unitprice, GenericFlag
from Medicine;

Leider erhalte ich eine Fehlermeldung in der Zeile, die CREATE VIEW showing enthält.

"CREATE VIEW muss die einzige Anweisung im Stapel sein"

Wie kann ich das beheben ?!

9
Kadaj13

Genau wie der Fehler besagt, muss die CREATE VIEW-Anweisung die einzige Anweisung im Abfragebatch sein.

In diesem Szenario haben Sie zwei Optionen, abhängig von der gewünschten Funktionalität:

  1. Platzieren Sie die CREATE VIEW-Abfrage am Anfang

    CREATE VIEW showing
    as
    select tradename, unitprice, GenericFlag
    from Medicine;
    
    with ExpAndCheapMedicine(MostMoney, MinMoney) as
    (
        select max(unitprice), min(unitprice)
        from Medicine
    )
    ,
    findmostexpensive(nameOfExpensive) as
    (
        select tradename
        from Medicine, ExpAndCheapMedicine
        where UnitPrice = MostMoney
    )
    ,
    findCheapest(nameOfCheapest) as
    (
        select tradename
        from Medicine, ExpAndCheapMedicine
            where UnitPrice = MinMoney
        )
    
  2. Verwenden Sie GO nach dem CTE und vor der CREATE VIEW-Abfrage

    -- Option 2

    with ExpAndCheapMedicine(MostMoney, MinMoney) as
    (
        select max(unitprice), min(unitprice)
        from Medicine
    )
    ,
    findmostexpensive(nameOfExpensive) as
    (
        select tradename
        from Medicine, ExpAndCheapMedicine
        where UnitPrice = MostMoney
    )
    ,
    findCheapest(nameOfCheapest) as
    (
        select tradename
        from Medicine, ExpAndCheapMedicine
        where UnitPrice = MinMoney
    )
    
    GO    
    
    CREATE VIEW showing
    as
    select tradename, unitprice, GenericFlag
    from Medicine;
    
13
Radu Gheorghiu

Ich bin auf diese Frage gestoßen, als ich versuchte, ein paar Ansichten innerhalb derselben Anweisung zu erstellen. Was für mich gut funktioniert hat, ist dynamisches SQL.

    EXEC('CREATE VIEW V1 as SELECT * FROM [T1];');
    EXEC('CREATE VIEW V2 as SELECT * FROM [T2];');
0