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

时间:2009-08-20 12:54:42

标签: sql sql-server database stored-procedures view

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

编辑:正在使用的DBMS是Microsoft SQL Server

10 个答案:

答案 0 :(得分:149)

FOR SQL SERVER

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

答案 1 :(得分:126)

上面已经说明了很多方法,但我最喜欢的方法之一就是失踪..

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

WHERE nView是视图的名称

更新2017-03-25:,因为@hanesjw建议删除商店程序,使用P代替V作为OBJECT_ID <的第二个参数/ p>

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

答案 2 :(得分:49)

这是最便携,最不干扰的方式:

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

编辑:这适用于SQL Server,它不需要您加入sys.schemas来获取视图的架构。如果一切都是dbo,这一点就不那么重要了,但是如果你正在好好利用模式,那么你应该记住这一点。

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

答案 3 :(得分:17)

if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )

答案 4 :(得分:13)

对于检查存在的人View,请使用此

SQL Server 2016 CTP3您可以使用新的 DIE 语句而不是大IF包装

语法

  

DROP VIEW [IF EXISTS] [schema_name。 ] view_name [...,n] [; ]

查询:

DROP VIEW IF EXISTS view_name

更多信息here

答案 5 :(得分:1)

如果是Oracle,您将使用“all_views”表。

这实际上取决于你的dbms。

答案 6 :(得分:1)

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

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;

答案 7 :(得分:0)

扩展凯文的答案。

    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));
        }
    }

答案 8 :(得分:0)

在SQL Server中,

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

答案 9 :(得分:0)

您可以通过多种方式查看视图的可用性

对于SQL SERVER

使用 sys.objects

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

使用 sysobjects

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.VIEWS

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

使用 OBJECT_ID

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

使用 sys.sql_modules

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