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

时间:2017-03-29 18:35:38

标签: sql-server tsql indexed-view

我试图编写一个非常简单的索引视图,但SQL只是拒绝我的努力。我已经尝试过研究这个问题但是没有运气,不幸的是我并不是一个SQL专家,所以我不确定我是否有一些简单的事情#&# 39; m失踪。这个脚本的模板由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"但是根据我的理解,在BEGIN...END之前和之后使用正确的GO语句将其包装起来应该已经解决了问题,但它仍然存在。谁能发现我做错了什么?

2 个答案:

答案 0 :(得分:1)

错误是准确的。在CREATE VIEW中包含BEGIN/END无法避免此消息。如果您完全删除BEGIN/END,那么批处理以CREATE VIEW开头,并在定义视图后以另一个GO结束,则错误将消失,您可以继续使用此DROP结构之前的CREATE

处理不创建已存在的视图的问题的一种略微不同的方法是调用动态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没有嵌入到字符串中,您可以很好地格式化它。

答案 1 :(得分:0)