我试图编写一个非常简单的索引视图,但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
语句将其包装起来应该已经解决了问题,但它仍然存在。谁能发现我做错了什么?
答案 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)
在SQL Server 2016中支持检查DROP VIEW IF EXISTS和CREATE OR ALTER VIEW。 参考: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/11/17/create-or-alter-another-great-language-enhancement-in-sql-server-2016-sp1/