CREATE VIEW moet het enige statement in de batch zijn

Ik probeer een weergave te maken. Tot nu toe heb ik dit geschreven:

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;

Helaas krijg ik een foutmelding op de regel met CREATE VIEW showing

“CREATE VIEW moet het enige statement in de batch zijn”

Hoe kan ik dit oplossen?!


Antwoord 1, autoriteit 100%

Zoals de fout zegt, moet de CREATE VIEW showing-instructie de enige instructie in de querybatch zijn.

Je hebt in dit scenario twee opties, afhankelijk van de functionaliteit die je wilt bereiken:

  1. Plaats de CREATE VIEW showing-query aan het begin

    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. Gebruik GONa de CTE en vóór de CREATE VIEWQUERY

    – Optie # 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;
    

Antwoord 2, Autoriteit 24%

Ik kwam deze vraag tegen toen ik probeerde een aantal opvattingen binnen dezelfde verklaring te creëren, wat goed werkte voor mij is het gebruik van dynamische SQL.

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

Antwoord 3, Autoriteit 4%

U kunt ook gebruiken:

CREATE VIEW vw_test1 AS SELECT [Name] FROM dbo.test1;
GO
CREATE VIEW vw_test2 AS SELECT [Name] FROM dbo.test2;
GO
--If you need to grant some rights, just use :
GRANT SELECT ON vw_test....

Het is eenvoudig te begrijpen en vermijden Dynamic SQL (zelfs als Dynamic SQL ook werkt)

Other episodes