如何在创建视图时执行IF / ELSE检查

时间:2018-05-09 16:10:47

标签: sql-server tsql sql-server-2016

我正在编写一个脚本来创建一个视图,只有在该视图尚不存在的情况下。如果视图已经存在,我不想改变它或删除并重新创建它。下面的语法显然不完整,并且生成错误,因为CREATE VIEW需要在它自己的批处理中 - 但是构建我的用例的正确方法是什么?

IF OBJECT_ID('dbo.view_name') IS NULL 
BEGIN    
  CREATE VIEW [dbo].[view_name]
  AS
      SELECT ...;
END
ELSE
  ...

2 个答案:

答案 0 :(得分:2)

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。

答案 1 :(得分:0)

我将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