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


Answers:


161

对于SQL Server

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

7
您可能也想加入sys.schema这里。
Eric

错误-无效的对象名称'sys.views'。我正在查询主数据库
2013年

如果您发现要在视图的CREATE和ALTER之间做出决定(就像我所做的那样),则这不适用于VIEWs-您必须先删除VIEW *,然后再创建它。IF EXISTS仍然适合于删除VIEW,所以谢谢!:) *操作时不要忘记任何权限。;)
FrostbiteXIII 2014年

试试这个。如果不存在,则创建视图(仅存根),然后更改该存根以放入更新。这样,您就不必删除它。 Structuralsight.com/2014/03/12/non-failing-scripts
kemiller2002

大概应该将要检查的视图的名称放在引号中吗?否则,它将永远无法工作:)
逆向工程师,于2008年

138

上面已经指定了许多方法,但是我最喜欢的方法之一却不见了。

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

nView视图的名称在哪里

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

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

4
我喜欢这一个。您也可以在表中使用“ u”。
菲利普·森

2
或为存储过程的“ P”。如果OBJECT_ID('dbo.sprocName','P')不为空则删除过程dbo.sprocName; GO
hanesjw

我不知道这是否是2009年的最佳答案,但似乎是在2016年(尽管SQL Server 2016引入了更好的选择)。
埃里克·J.


55

这是最可移植,最少侵入的方式:

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
使用sqlite:SQL错误:没有这样的表:INFORMATION_SCHEMA.VIEWS

@lutz:+1,因为缺少对SQLite的支持。
Alix Axel

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

对于Microsoft SQL Server,我发现这最为有用,因为在创建架构管理脚本时经常使用IF EXISTS。在脚本中,您可能已经具有CREATE ViEW [dbo]。[MyView],而上面的代码是用于复制和粘贴的最简单的代码段。
Jimmy Bosse 2014年

15

对于检查存在下降的人View使用此

SQL Server 2016 CTP3您可以使用新的DIE 语句代替大IF包装

句法

删除视图[如果存在] [schema_name。] view_name [...,n] [; ]

查询:

DROP VIEW IF EXISTS view_name

更多信息在这里


1

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

这实际上取决于您的dbms。


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;

1

在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

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

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

使用系统对象

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.