我正在尝试编写一个非常简单的索引视图,但SQL只是拒绝我的努力。我尝试研究这个问题,但没有任何运气,不幸的是,我不完全是SQL专家,所以我不确定我是否缺少一些简单的东西。这个脚本的模板是由一个DBA交给我的,但他并不比我更了解。下面是出现第一个错误的脚本的顶端:
--Set the options to support indexed views.
SET NUMERIC_ROUNDABORT OFF;
GO
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO
--Create view with schemabinding.
IF OBJECT_ID ('[dbo].[APIMenus]', 'view') IS NOT NULL
DROP VIEW [dbo].[APIMenus] ;
GO
BEGIN
CREATE VIEW [dbo].[APIMenus]
WITH SCHEMABINDING
AS
SELECT
[t0].[GroupName] AS [defaultValue],
[t1].[GroupName] AS [transValue],.....
错误是"CREATE VIEW must be the only statement in the batch"
但据我了解,在前后使用适当的GO
语句将其包装在BEGIN...END
中应该可以解决问题,但它仍然存在。谁能发现我做错了什么?
错误是准确的。将CREATE VIEW
包装在BEGIN/END
中无法避免此消息。 如果完全删除BEGIN/END
,以便在定义视图后批处理以CREATE VIEW
开头并以另一个GO
结束,则错误将消失,您可以在CREATE
结构之前继续使用此DROP
。
处理不创建已存在的视图的问题的一种略有不同的方法是调用动态 SQL:
if OBJECT_ID ('[dbo].[cars]', 'view') IS NOT NULL
exec ('create view cars as select * from vans where type=1')
go
有时我看到这个:
if OBJECT_ID ('[dbo].[cars]', 'view') IS NOT NULL
exec ('create view cars as select 1')
go
alter view cars as
select * from vans where type==1
GO
后一种技术的优点是,复杂的SQL没有嵌入到字符串中,你可以很好地格式化它。
检查"删除视图(如果存在)"和"创建或更改视图",两者都在 SQL Server 2016 中受支持。 裁判: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/11/17/create-or-alter-another-great-language-enhancement-in-sql-server-2016-sp1/