是否可以使用 sp_executesql 创建视图?

Is it possible to use sp_executesql to create a view?

我可以使用以下语句在我的数据库中创建一个空的存储过程:

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

但是,如果我尝试使用相同的语句创建视图(除了在 create 语句中使用 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 Q&A,但他们没有明确的答案。 这是我通读过的一个例子: error in EXECUTE sp_executesql

注意 2:我在 运行 这个 SQL Server Express 实例上 - SQL Server 2014 SP3 CU3 - 12.0。 6259.0(最新版本)

附加信息

当您使用代码创建 SP 时,它最终创建的 SP 如下所示:

CREATE PROCEDURE [dbo].[vwAS2ConnectionUpdated] as

但是,它不会创建那样的视图。也许这是 SQL 服务器解析器等中的错误,或者 sp_executesql(它允许像那样创建 SP??)

可以通过 sp_executesql 使用 CREATE VIEW,请参见以下示例:

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, you'll see that select_statement isn't listed in brackets ([]) 的文档,这意味着它不是可选的。

CREATE PROCEDURE 的文档显示过程主体的语法为:

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

这分解为:

  • 开头为AS
  • BEGINEND是可选的
  • 可以有一个或多个 sql_statements 可选地以 semi-colon
  • 结尾

粗略搜索后,我在任何地方都找不到 sql_statement 的语法,但看起来空字符串确实是有效的 sql_statementCREATE PROCEDURE [dbo].[AnotherProcedure] as ; 将创建一个存储过程这一事实支持这一点。

Is it possible to use sp_executesql to create a view?

是的,可以创建类似

的视图
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页面可以看到定义:

Creates a virtual table whose contents (columns and rows)...

虽然 N'CREATE VIEW [dbo].[vwAS2ConnectionUpdated] as' 似乎没有列和行,但是当您定义 table 时,table 应该有列。

此外,如果您查看语法,您会发现

AS select_statement

因此,它是 CREATE VIEW 语法的一部分,这意味着您需要一个 SELECT 语句。

此外,如果您查看 Arguments 部分,您会看到

select_statement

Is the SELECT statement that defines the view. The statement can use more than one table and other views. Appropriate permissions are required to select from the objects referenced in the SELECT clause of the view that is created.

所以,如果你不包含 SELECT 语句,你根本就没有定义你的视图,它是 VIEW 的定义,因此应该使用它。