web-dev-qa-db-fra.com

CREATE VIEW doit être la seule instruction du lot.

J'essaie de faire une vue. Jusqu'à présent, j'ai écrit ceci:

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;

Malheureusement, je reçois une erreur sur la ligne contenant CREATE VIEW showing

"CREATE VIEW doit être la seule instruction du lot"

Comment puis-je réparer cela?!

9
Kadaj13

Comme le dit l'erreur, l'instruction CREATE VIEW doit être la seule instruction du lot de requêtes.

Vous avez deux options dans ce scénario, en fonction de la fonctionnalité que vous souhaitez obtenir:

  1. Placez la requête CREATE VIEW au début

    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. Utilisez GO après le CTE et avant la requête CREATE VIEW

    -- 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

Je suis tombé sur cette question lorsque j'essayais de créer deux vues dans la même déclaration. Ce qui a bien fonctionné pour moi, c'est l'utilisation de SQL dynamique.

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