是否可以使用 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
BEGIN
和END
是可选的
- 可以有一个或多个
sql_statement
s 可选地以 semi-colon 结尾
粗略搜索后,我在任何地方都找不到 sql_statement
的语法,但看起来空字符串确实是有效的 sql_statement
。 CREATE 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
的定义,因此应该使用它。
我可以使用以下语句在我的数据库中创建一个空的存储过程:
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
BEGIN
和END
是可选的- 可以有一个或多个
sql_statement
s 可选地以 semi-colon 结尾
粗略搜索后,我在任何地方都找不到 sql_statement
的语法,但看起来空字符串确实是有效的 sql_statement
。 CREATE 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
的定义,因此应该使用它。