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 должен быть единственным оператором в пакете»

Как я могу это исправить?!


person Kadaj13    schedule 03.12.2014    source источник
comment
Я пытаюсь понять, почему вы создаете CTE, на которые затем не ссылаются в представлении. Это два отдельных запроса или вы планируете добавить наборы результатов из CTE в свое представление позже?   -  person AHiggins    schedule 03.12.2014


Ответы (3)


Как говорится в ошибке, оператор CREATE VIEW должен быть единственным оператором в пакете запросов.

В этом сценарии у вас есть два варианта, в зависимости от функциональности, которую вы хотите достичь:

  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. Используйте GO после CTE и перед запросом CREATE VIEW

    -- Вариант №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;
    
person Radu Gheorghiu    schedule 03.12.2014
comment
Я думаю, что ваш ответ может лучше соответствовать тому, о чем просит ОП; тот факт, что CTE не упоминаются в операторе SELECT, может указывать на то, что это две разные проблемы. Однако я не уверен, планирует ли ОП использовать эти CTE в представлении на более позднем этапе разработки, поэтому я пока оставлю свой ответ здесь, пока ОП не ответит на мой вопрос. - person AHiggins; 03.12.2014
comment
@AHiggins Да, ОП должен дать еще несколько подробностей об этом. Но, видя, что в его вопросе VIEW находится после CTE, я предположил, что есть только этот маленький SELECT для представления, а CTE — это просто некоторый код, который у него также есть в окне запроса (возможно, в SSMS ) и он пытается выполнить все запросы в окне и получает ошибку. - person Radu Gheorghiu; 03.12.2014
comment
Кажется, последнее предложение не работает (по крайней мере, в SQL Server 2014). Здесь есть решение: stackoverflow.com/questions/3133982/ - person Wouter; 27.09.2016
comment
Вы тестировали это. Когда я просто оборачиваю оператор создания представления с помощью BEGIN и END, я все равно получаю сообщение об ошибке. - person Timothy Gonzalez; 08.10.2016
comment
@TimothyGonzalez Вы сможете сделать это, вставив оператор GO перед ключевым словом CREATE. - person Radu Gheorghiu; 08.10.2016
comment
Как говорит @TimothyGonzalez, вариант 2.2 вообще не работает. - person user247702; 26.07.2017
comment
@Stijn удалено. Это мой очень старый пост, я не знаю, о чем я думал, когда писал это. Спасибо, что напомнили мне взглянуть на это еще раз. Я был бы признателен за исправление в отрицательных голосах, если бы это было для этого. - person Radu Gheorghiu; 26.07.2017
comment
Спасибо за исправление. Мой голос был соответствующим образом скорректирован :) - person user247702; 26.07.2017
comment
@Stijn с благодарностью! - person Radu Gheorghiu; 26.07.2017

Я столкнулся с этим вопросом, когда пытался создать пару представлений в одном и том же операторе, и для меня хорошо сработало использование динамического SQL.

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

Вы также можете использовать:

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

Это легко понять и избежать динамического SQL (даже если динамический SQL также работает)

person AlexB    schedule 25.01.2021