Можно ли использовать sp_executesql для создания представления? - PullRequest
0 голосов
/ 10 июня 2019

Я могу использовать следующие операторы для создания пустого хранимого процесса в моей базе данных:

declare @statement as NVARCHAR(250) 
set @statement  = N'CREATE PROCEDURE [dbo].[vwAS2ConnectionUpdated] as' 
exec dbo.sp_executesql @statement

Однако, если я пытаюсь создать представление, используя те же операторы (за исключением использования VIEW в операторе создания) *, я получаю ошибку.

declare @statement as NVARCHAR(250) 
set @statement  = N'CREATE VIEW [dbo].[vwAS2ConnectionUpdated] as' 
exec dbo.sp_executesql @statement

Ошибка:

Incorrect syntax near 'as'.

Можете ли вы сказать мне, почему это может происходить?
Можно ли создать представление с помощью sp_executesql?

Примечание : Я уже просматривал другие подобные вопросы и ответы по SO, но они не являются окончательным ответом. Вот один пример, который я прочитал: ошибка в EXECUTE sp_executesql

Примечание 2 : я запускаю это на экземпляре SQL Server Express - SQL Server 2014 с пакетом обновления 3 (SP3) CU3 - 12.0.6259.0 (последняя сборка)

Дополнительная информация

Когда вы используете код для создания SP, он в итоге создает SP, который выглядит следующим образом:

CREATE PROCEDURE [dbo].[vwAS2ConnectionUpdated] as

Однако, он не будет создавать такой вид. Может быть, это ошибка в синтаксическом анализаторе SQL Server и т. Д. Или в том, что sp_executesql (что позволяет создавать SP таким образом ??)

Ответы [ 2 ]

3 голосов
/ 10 июня 2019

Можно использовать CREATE VIEW через sp_executesql, см. Следующий пример:

declare @statement as NVARCHAR(250) 
set @statement  = N'CREATE VIEW [dbo].[MyView] as SELECT 1 [ColumnName]' 
exec dbo.sp_executesql @statement

SELECT  [ColumnName]
FROM    [dbo].[MyView]

Причина, по которой вы видите ошибку, заключается в том, что вы не указываете инструкцию SELECT, которую должно выполнить представление. Если вы посмотрите документацию для CREATE VIEW, вы увидите, что select_statement не указан в скобках ([]), что означает, что это не является обязательным.

В документации для CREATE PROCEDURE приведен синтаксис тела процедуры:

AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }  

Это разбивается на:

  • Начинается с AS
  • BEGIN и END являются необязательными
  • Может быть один или несколько sql_statement, которые могут заканчиваться точкой с запятой

Я не могу найти синтаксис для sql_statement нигде после беглого поиска, но, похоже, пустая строка является допустимой sql_statement. Это подтверждается тем фактом, что CREATE PROCEDURE [dbo].[AnotherProcedure] as ; создаст хранимую процедуру.

2 голосов
/ 10 июня 2019

Можно ли использовать sp_executesql для создания представления?

Да, возможно создать представление типа

EXEC sp_exeutesql N'DROP VIEW IF EXISTS [dbo].[MyView]; CREATE VIEW [MyView] AS SELECT 1 AS Col';

Теперь перейдем к Почему бы не просто N'CREATE VIEW [dbo].[vwAS2ConnectionUpdated] as'

Посетив страницу CREATE VIEW, вы можете увидеть определение:

Создает виртуальную таблицу , содержимое которой (столбцы и строки) ...

Хотя N'CREATE VIEW [dbo].[vwAS2ConnectionUpdated] as', кажется, не имеет столбцы и строки, причина при определениитаблица должна иметь столбцы.

Кроме того, если вы посмотрите на синтаксис, вы найдете

AS select_statement

Итак,это часть синтаксиса CREATE VIEW, что означает, что вам нужен оператор SELECT.

Кроме того, если вы посмотрите на часть Arguments , вы увидите

select_statement

Является оператором SELECT, который определяет представление. Оператор может использовать более одной таблицы и других представлений.Соответствующие разрешения требуются для выбора объектов, на которые есть ссылка в предложении SELECT создаваемого представления.

Итак, если вы не включите оператор SELECT, вы не определите свойвообще, это определение VIEW, поэтому его следует использовать.

...