可以使用sp_executesql创建视图吗?

时间:2019-06-10 14:43:53

标签: sql sql-server tsql sql-server-express

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

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 Server解析器等中的错误,或者是sp_executesql(它允许像这样创建SP?)。

2 个答案:

答案 0 :(得分:3)

可以通过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的文档,则会发现bracketsselect_statement)中未列出[],这意味着它不是可选的。

CREATE PROCEDURE的文档显示了该过程正文的语法为:

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

这可分为:

  • AS开头
  • BEGINEND是可选的
  • 可以有一个或多个sql_statement,可以选择以分号终止

在经过粗略的搜索之后,我找不到sql_statement的语法,但是肯定看起来像一个空字符串是有效的sql_statementCREATE PROCEDURE [dbo].[AnotherProcedure] as ;将创建存储过程的事实对此提供了支持。

答案 1 :(得分:2)

  

是否可以使用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语句。

此外,如果您查看参数部分,您将看到

  

select_statement

     

是用于定义视图的SELECT语句。该语句可以使用多个表和其他视图。从创建的视图的SELECT子句中引用的对象中进行选择需要适当的权限。

因此,如果您不包含SELECT语句,则根本不会定义视图,它是VIEW的定义,因此应使用它。