如何检查数据库中是否存在视图?

如果数据库中存在某个视图,则需要执行一些 SQL 代码。如何检查视图是否存在?

编辑: 正在使用的数据库管理系统是 Microsoft SQL Server 的

209342 次浏览

用于 SQL SERVER

IF EXISTS(select * FROM sys.views where name = '')

这是最便携、最不打扰人的方式:

select
count(*)
from
INFORMATION_SCHEMA.VIEWS
where
table_name = 'MyView'
and table_schema = 'MySchema'

编辑: 这在 SQLServer 上确实可以工作,并且它不需要您加入到 sys.schemas来获得视图的模式。如果一切都是 dbo,这就不那么重要了,但是如果您正在很好地利用模式,那么您应该记住这一点。

每个 RDBMS 都有自己的检查元数据的小方法,就像这样,但是 information_schema实际上是 ANSI,我认为 Oracle 和显然 SQLite 是唯一不以某种方式支持它的。

如果是 Oracle,则使用“ all _ views”表。

这真的取决于你的数据库。

详细解释凯文的回答。

    private bool CustomViewExists(string viewName)
{
using (SalesPad.Data.DataConnection dc = yourconnection)
{
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(String.Format(@"IF EXISTS(select * FROM sys.views where name = '{0}')
Select 1
else
Select 0", viewName));
cmd.CommandType = CommandType.Text;
return Convert.ToBoolean(dc.ExecuteScalar(cmd));
}
}
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )

如果要检查所有现有视图的有效性和一致性,可以使用以下查询

declare @viewName sysname
declare @cmd sysname
DECLARE check_cursor CURSOR FOR
SELECT cast('['+SCHEMA_NAME(schema_id)+'].['+name+']' as sysname) AS viewname
FROM sys.views


OPEN check_cursor
FETCH NEXT FROM check_cursor
INTO @viewName


WHILE @@FETCH_STATUS = 0
BEGIN


set @cmd='select * from '+@viewName
begin try
exec (@cmd)
end try
begin catch
print 'Error: The view '+@viewName+' is corrupted .'
end catch
FETCH NEXT FROM check_cursor
INTO @viewName
END
CLOSE check_cursor;
DEALLOCATE check_cursor;

上面已经有很多具体的方法,但是我最喜欢的一个缺失了。

GO
IF OBJECT_ID('nView', 'V') IS NOT NULL
DROP VIEW nView;
GO

其中 nView是视图的名称

更新2017-03-25: as@hanesjw 建议删除一个存储过程,使用 P而不是 V作为 OBJECT_ID的第二个参数

GO
IF OBJECT_ID( 'nProcedure', 'P' ) IS NOT NULL
DROP PROCEDURE dbo.sprocName;
GO

对于检查是否存在删除 View的人,请使用以下命令

SQL Server 2016 CTP3可以使用新的 去死吧语句而不是大的 IF包装器

语法

DROP VIEW [ IF EXISTS ][ schema _ name. ] VIEW _ name [ ... ,n ][ ; ]

质疑:

DROP VIEW IF EXISTS view_name

更多信息 给你

在 SQL 服务器中,

declare @ViewName nvarchar(20)='ViewNameExample'


if exists(SELECT 1 from sys.objects where object_Id=object_Id(@ViewName) and Type_Desc='VIEW')
begin
-- Your SQL Code goes here ...


end

您可以通过各种方式检查视图的可用性

用于 SQL SERVER

使用 Sys 对象

IF EXISTS(
SELECT 1
FROM   sys.objects
WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
AND Type_Desc = 'VIEW'
)
BEGIN
PRINT 'View Exists'
END

使用 Sysoobject

IF NOT EXISTS (
SELECT 1
FROM   sysobjects
WHERE  NAME = '[schemaName].[ViewName]'
AND xtype = 'V'
)
BEGIN
PRINT 'View Exists'
END

使用 Sys.views

IF EXISTS (
SELECT 1
FROM sys.views
WHERE OBJECT_ID = OBJECT_ID(N'[schemaName].[ViewName]')
)
BEGIN
PRINT 'View Exists'
END

使用 INFORMATION _ Schema. 视图

IF EXISTS (
SELECT 1
FROM   INFORMATION_SCHEMA.VIEWS
WHERE  table_name = 'ViewName'
AND table_schema = 'schemaName'
)
BEGIN
PRINT 'View Exists'
END

使用 目标 _ ID

IF EXISTS(
SELECT OBJECT_ID('ViewName', 'V')
)
BEGIN
PRINT 'View Exists'
END

使用 模块

IF EXISTS (
SELECT 1
FROM   sys.sql_modules
WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
PRINT 'View Exists'
END