我可以使用以下语句在数据库中创建一个空的存储过程:
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?)。
答案 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
的文档,则会发现brackets(select_statement
)中未列出[]
,这意味着它不是可选的。>
CREATE PROCEDURE
的文档显示了该过程正文的语法为:
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
这可分为:
AS
开头BEGIN
和END
是可选的sql_statement
,可以选择以分号终止在经过粗略的搜索之后,我找不到sql_statement
的语法,但是肯定看起来像一个空字符串是有效的sql_statement
。 CREATE 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
的定义,因此应使用它。