#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
aVIEW
и возвращать данные из него в одном запросе. Вам понадобятся 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');