创建视图时如何执行 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 ALTERDROP 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 检查的主要内容,如果未能解决你的问题,请参考以下文章

如何将 if else 语句添加到按钮和 .sheet?

SwiftUI:使用“if else”更改视图

如何检查视图是不是存在,如果不存在则创建

如何获得oracle物化视图 定时刷新时 刷新所用的时间 或者是监控 物化视图在jobs中建立的job任务的执行时间

加载时 NIB 视图没有子视图

IOS 滚动视图问题