2014-12-03 11 views
6

Sto provando a visualizzare. Finora, ho scritto questo:CREATE VIEW deve essere l'unica istruzione nel lotto

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; 

Purtroppo, ottengo un errore sulla riga contenente CREATE VIEW showing

"CREATE VIEW deve essere l'unica istruzione del batch"

Come posso risolvere questo problema ?!

+2

Sto cercando di capire perché si creano CTE che non vengono quindi referenziati nella vista. Sono queste due query separate o hai intenzione di aggiungere i risultati dalla CTE alla tua vista in un secondo momento? – AHiggins

risposta

5

Proprio come dice l'errore, l'istruzione CREATE VIEW deve essere l'unica istruzione nel batch di query.

Hai due possibilità in questo scenario, a seconda della funzionalità che si vuole raggiungere:

  1. Posizionare il CREATE VIEW interrogazione all'inizio

    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. Usa GO dopo il CTE e prima la query CREATE VIEW

    - Opzione n.

    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; 
    
+0

Penso che la tua risposta potrebbe adattarsi meglio a ciò che l'OP sta chiedendo; il fatto che le CTE non siano referenziate all'interno dell'istruzione SELECT potrebbe indicare che si tratta di due problemi separati. Non sono sicuro, tuttavia, se l'OP intende utilizzare questi CTE nella vista durante una fase successiva di sviluppo, quindi lascerò qui la mia risposta fino al momento in cui l'OP risponderà alla mia domanda. – AHiggins

+0

@AHiggins Sì, l'OP dovrebbe fornire qualche dettaglio in merito. Ma visto che nella sua domanda il VIEW è ** dopo ** il CTE, allora ho assunto che ci sia solo quel piccolo SELECT per la vista e il CTE è solo un codice che ha anche nella finestra della query (possibilmente in SSMS) e che è cercando di eseguire tutte le query nella finestra e ottiene un errore. –

+0

Sembra che l'ultimo suggerimento non funzioni (almeno in SQL Server 2014). C'è una soluzione qui: http://stackoverflow.com/questions/3133982/why-cant-i-create-a-view-inside-of-a-begin-end-block – Wouter

Problemi correlati