web-dev-qa-db-ja.com

CREATE VIEWはバッチ内の唯一のステートメントでなければなりません

ビューを作成しようとしています。これまでのところ、私はこれを書いています:

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;

残念ながら、CREATE VIEW showingを含む行でエラーが発生します

「CREATE VIEWはバッチ内の唯一のステートメントでなければなりません」

どうすれば修正できますか?!

12
Kadaj13

エラーが言うように、CREATE VIEWステートメントはクエリバッチ内の唯一のステートメントである必要があります。

このシナリオには、実現する機能に応じて2つのオプションがあります。

  1. CREATE VIEWクエリを先頭に配置します

    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. CTEの後、CREATE VIEWクエリの前にGOを使用します

    -オプション#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;
    
17
Radu Gheorghiu

同じステートメント内でいくつかのビューを作成しようとしていたときにこの質問に出くわしました。動的SQLを使用するとうまくいきました。

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