无法使用架构绑定创建索引视图



我正在尝试编写一个非常简单的索引视图,但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/

最新更新