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 检查表是不是存在的主要内容,如果未能解决你的问题,请参考以下文章