创建视图时如何执行 IF/ELSE 检查
Posted
技术标签:
【中文标题】创建视图时如何执行 IF/ELSE 检查【英文标题】:How to perform an IF/ELSE check when creating a view 【发布时间】:2018-05-09 16:10:47 【问题描述】:我正在编写一个脚本来创建一个视图,但前提是该视图尚不存在。如果视图确实存在,我不想更改它或删除并重新创建它。下面的语法显然不完整,并且会产生错误,因为 CREATE VIEW
需要在自己的批处理中 - 但是构建我的用例的正确方法是什么?
IF OBJECT_ID('dbo.view_name') IS NULL
BEGIN
CREATE VIEW [dbo].[view_name]
AS
SELECT ...;
END
ELSE
...
【问题讨论】:
什么版本的 SQL?随着版本的增加,可用的 (imo) 方法越来越多。 嘿@JacobH,SQL Server 2016。 似乎与以下内容重复:***.com/questions/18534919/… @xQbert SQL Server 2016 有CREATE OR ALTER
和 DROP IF EXISTS
。这仅出现在链接问题的第四个答案中。这不是最好的副本
@PanagiotisKanavos 虽然是这样,但如果 OP 只想创建不存在的视图,但 不 想要如果它已经存在,请更改它。在那种情况下,我认为他们需要IF NOT EXISTS () ... dynamic SQL
。
【参考方案1】:
SQL Server 2016 有 CREATE OR ALTER
。
CREATE OR ALTER VIEW vw_your_view
AS
SELECT 1 FROM your_Table
GO
如果你将它移到 SQL Server 2016 以下的环境中,这将会崩溃。如果是这种情况,请使用你所拥有的并检查 obj ID。
【讨论】:
谢谢@dfundako,如果它存在,我绝对不想改变。如果它已经存在,我只是不希望该语句执行任何操作。 @MikeMarks 好吧,如果您每次都传递相同的代码,它不会真正改变任何东西。但它仍在对对象运行操作。【参考方案2】:我将 SQL 更改为以下内容。为了避免“CREATE VIEW
必须在它自己的批处理中”错误,我将“CREATE VIEW
”包裹在 exec('')
语句中。这行得通!
USE [XXXXXXXXX]
GO
/****** Object: View [CXXXXXXX].[_MobileMessageTracking_v2] Script Date: 5/4/2018 3:19:04 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF Object_id('CXXXXXXX._MobileMessageTracking_v2') IS NULL BEGIN
exec('CREATE VIEW [CXXXXXXX].[_MobileMessageTracking_v2]
AS
SELECT
/* fields here */
FROM CXXXXXXXX._MobileMessageTracking AS M WITH (NOLOCK)
WHERE M.MID = XXXXXXX
AND M.CreateDateTime >= DATEADD(mm,-6, GETDATE())
UNION
select
/* fields here */')
END
GO
【讨论】:
小心将 NOLOCK 提示溅到各处。重现缺失和/或重复行等异常情况非常有趣且不可能。除非您真的不关心数据的准确性,否则在视图中这几乎总是一个错误的决定。 blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere以上是关于创建视图时如何执行 IF/ELSE 检查的主要内容,如果未能解决你的问题,请参考以下文章