【问题标题】:How can I check if a View exists in a Database?如何检查数据库中是否存在视图?
【发布时间】:2010-11-21 07:37:34
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    用于 SQL 服务器

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

    【讨论】:

    • 您可能也想在这里加入sys.schema
    • 错误 - 无效的对象名称“sys.views”。我正在查询主数据库
    • 如果您发现这是在视图的 CREATE 和 ALTER 之间做出决定(就像我所做的那样),这对 VIEW 不起作用 - 您必须 DROP VIEW* 然后创建它。 IF EXISTS 仍然适用于 DROPing the VIEW 寿,所以谢谢! :) * 当你这样做时不要忘记任何权限。 ;)
    • 试试这个。如果它不存在,则创建视图(只是一个存根),然后更改该存根以放入您的更新。这样您就不必删除它。 structuredsight.com/2014/03/12/non-failing-scripts
    • 大概应该将要检查的视图的名称放在引号中?否则这将永远无法工作:)
    【解决方案2】:

    这是最便携、干扰最小的方式:

    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 是唯一不以某种方式支持它的方法。

    【讨论】:

    • 使用 sqlite:SQL 错误:没有这样的表:INFORMATION_SCHEMA.VIEWS
    • @lutz:+1,因为缺乏对 SQLite 的支持。
    【解决方案3】:

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

    这真的取决于你的 dbms。

    【讨论】:

      【解决方案4】:

      扩展凯文的答案。

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

      【讨论】:

        【解决方案5】:
        if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )
        

        【讨论】:

        • 对于 Microsoft SQL Server,我发现这是最有用的,因为在创建模式管理脚本时经常使用 IF EXISTS。在脚本中,您可能已经拥有 CREATE View [dbo].[MyView],上面是用于复制和粘贴的最简单的 sn-p。
        【解决方案6】:

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

        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】:

          上面已经指定了很多方法,但我最喜欢的方法之一不见了..

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

          WHERE nView 是视图的名称

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

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

          【讨论】:

          【解决方案8】:

          对于检查存在以删除View 的人使用此

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

          语法

          删除视图 [如果存在] [模式名称。 ] view_name [ ...,n ] [ ; ]

          查询:

          DROP VIEW IF EXISTS view_name
          

          更多信息here

          【讨论】:

            【解决方案9】:

            在 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
            

            【讨论】:

              【解决方案10】:

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

              用于 SQL 服务器

              使用 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
              

              【讨论】:

                猜你喜欢
                • 2021-07-07
                • 1970-01-01
                • 2023-03-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-24
                相关资源
                最近更新 更多