CREATE VIEW AS SELECT FROM 检查表是不是存在

Posted

技术标签:

【中文标题】CREATE VIEW AS SELECT FROM 检查表是不是存在【英文标题】: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。

【问题讨论】:

【参考方案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 包装在任何其他语句中。

以上是关于CREATE VIEW AS SELECT FROM 检查表是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

MySQL--视图

Oracle视图 create View

创建视图sql

oracle 关于 create temporary table as select……

mysql-视图

10-02视图的创建