【问题标题】:CREATE VIEW AS SELECT FROM with check if table existsCREATE VIEW AS SELECT FROM 检查表是否存在
【发布时间】:2017-07-12 14:15:05
【问题描述】:

是否可以在创建视图时检查我从中选择的表是否确实存在?为了防止无效的对象名称'MyItems'关键字VIEW附近的语法不正确

-- ok this is super simplistic
-- but it is enough to illustrate the point
CREATE VIEW vw_MyView
AS
SELECT DISTINCT Id, Name, COUNT(CategoryId) OVER (PARTITION BY Id) AS Total
FROM MyItems
GO

我有一堆这些视图是作为批处理脚本的一部分创建的。在此示例中,如果 MyItems 不存在,则执行会中断整个批处理脚本。

所以,我想我会在每个 CREATE VIEW 语句前添加一堆检查,以确保表确实存在。

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[MyItems]') AND type IN (N'U'))
    -- CREATE VIEW <snip></snip>
GO

但事实证明,CREATE VIEW 语句必须是查询批处理中的第一条语句。

回到我的问题,当 CREATE VIEW 因为从不存在的表中读取而无法完成时,是否有某种解决方法可以捕获?

我正在使用 MS SQL Server 2008 R2。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    使用动态 SQL 的另一种选择:

    DECLARE @sqlcmd NVARCHAR(MAX);
    
    SELECT @sqlcmd = 
    'CREATE VIEW vw_MyView
     AS
     SELECT DISTINCT Id, Name, COUNT(CategoryId) OVER (PARTITION BY Id) AS Total
     FROM MyItems
     GO';
    
    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[MyItems]') AND type IN (N'U'))
      BEGIN
        EXEC sp_executesql @sqlcmd
      END
    
    ELSE
      BEGIN 
        PRINT 'Table doesnt exist'
      END
    

    【讨论】:

      【解决方案2】:

      此代码可能对您有所帮助,请尝试一次

      IF EXISTS (
              SELECT 1
              FROM INFORMATION_SCHEMA.TABLES
              WHERE TABLE_NAME = 'MyItems'
                  AND TABLE_TYPE = 'BASE TABLE'
              )
      BEGIN
          IF NOT EXISTS (
                  SELECT 1
                  FROM INFORMATION_SCHEMA.TABLES
                  WHERE TABLE_NAME = 'vw_MyView'
                      AND TABLE_TYPE = 'VIEW'
                  )
          BEGIN
              CREATE VIEW vw_MyView
              AS
              SELECT DISTINCT Id
                  ,NAME
                  ,COUNT(CategoryId) OVER (PARTITION BY Id) AS Total
              FROM MyItems 
          END 
      END
      

      【讨论】:

      • 我已经尝试了一些类似的方法,并且 CREATE VIEW 语句必须是查询批处理中的第一个语句。这使我相信您不能将 CREATE VIEW 包装在任何其他语句中。
      猜你喜欢
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      相关资源
      最近更新 更多