Неправильный синтаксис MSSQL рядом с ключевым словом ‘SELECT’

#sql-server

#sql-сервер

Вопрос:

Я получаю Incorrect syntax near the keyword 'SELECT'. .из драйвера JDBC sqlserver. Но он отлично работает из SQL Server Management Studio.

     CREATE  VIEW REVENUE0 (SUPPLIER_NO, TOTAL_REVENUE) AS  SELECT L_SUPPKEY,    SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) FROM    LINEITEM WHERE  L_SHIPDATE  >= '1997-05-01' AND     L_SHIPDATE  < dateadd(mm, 3, cast ('1997-05-01' as date)) GROUP BY  L_SUPPKEY 
    GO

    SELECT  S_SUPPKEY,  S_NAME,     S_ADDRESS,  S_PHONE,    TOTAL_REVENUE FROM  SUPPLIER,   REVENUE0 WHERE  S_SUPPKEY   = SUPPLIER_NO AND   TOTAL_REVENUE   = ( SELECT  MAX(TOTAL_REVENUE)
                FROM    REVENUE0
              ) ORDER   BY  S_SUPPKEY

    DROP VIEW REVENUE0
  

Комментарии:

1. VIEW Не может содержать несколько наборов данных. Этот запрос также завершится ошибкой в SSMS. Вам нужно создать VIEW в своем собственном пакете. В SSMS это было бы с помощью GO , в других приложениях это может означать выполнение 2 вызовов оператора.

2. Нет, потому что GO это не ключевое слово Transact-SQL, @curiousguy. Это ключевое слово IDE, которое такие приложения, как SSMS, обнаруживают и используют в качестве разделителя пакетов. Вот почему я сказал «в других приложениях это может означать выполнение 2 вызовов оператора». .

3. «Я пытаюсь создать и запросить из представления в одном запросе» Вы не можете, @curiousguy . VIEW Определение должно быть единственным оператором в пакете. Вы не можете CREATE / ALTER a VIEW и возвращать данные из него в одном запросе. Вам понадобятся 2 отдельных пакета.

4. Это ничего не меняет. DROP все равно должен быть в отдельном пакете, @curiousguy . Как я уже говорил «Определение ПРЕДСТАВЛЕНИЯ должно быть единственным оператором в пакете».

5. Похоже, вы должны использовать CTE вместо представления.

Ответ №1:

Вы пробовали создавать представление «динамически»?

 exec('create view mytest as select * from sys.objects');
select * from mytest;
drop view if exists mytest; -- or ... exec('drop view mytest');