Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何检查数据库中是否存在视图?_Sql_Sql Server_Database_Stored Procedures_View - Fatal编程技术网

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

Sql 如何检查数据库中是否存在视图?,sql,sql-server,database,stored-procedures,view,Sql,Sql Server,Database,Stored Procedures,View,如果数据库中存在某个视图,则需要执行一些SQL代码。如何检查视图是否存在 编辑:正在使用的DBMS是Microsoft SQL Server FOR SQL Server IF EXISTS(select * FROM sys.views where name = '') 这是最便携、侵入性最低的方式: select count(*) from INFORMATION_SCHEMA.VIEWS where table_name = 'MyView' and ta

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

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

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

这是最便携、侵入性最低的方式:

select
    count(*)
from
    INFORMATION_SCHEMA.VIEWS
where
    table_name = 'MyView'
    and table_schema = 'MySchema'
编辑:这在SQL Server上有效,并且不需要您加入
sys.schemas
来获取视图的架构。如果一切都是
dbo
,那么这一点就不那么重要了,但是如果您充分利用了模式,那么您应该记住这一点


每个RDBMS都有自己的检查元数据的小方法,但是
信息模式实际上是ANSI,我认为Oracle和SQLite是唯一在某种程度上不支持它的。如果是Oracle,你会使用“所有视图”表


这真的取决于你的数据库管理系统。

来扩展凯文的答案

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

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

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:正如@hanesjw建议删除存储过程一样,使用
p
而不是
V
作为
OBJECT\u ID

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

对于检查是否存在以删除
视图的人员,请使用此

SQL Server 2016 CTP3
中,您可以使用新的DIE语句而不是大
IF
wrappers

语法

下拉视图[如果存在][架构名称]视图名称[…,n][;]

查询:

DROP VIEW IF EXISTS view_name
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

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

对于SQL SERVER

IF EXISTS(select * FROM sys.views where name = '')
使用系统对象

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
IF EXISTS (
   SELECT 1
   FROM sys.views
   WHERE OBJECT_ID = OBJECT_ID(N'[schemaName].[ViewName]')
)
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
使用系统对象

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
IF EXISTS (
   SELECT 1
   FROM sys.views
   WHERE OBJECT_ID = OBJECT_ID(N'[schemaName].[ViewName]')
)
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
使用系统视图

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
IF EXISTS (
   SELECT 1
   FROM sys.views
   WHERE OBJECT_ID = OBJECT_ID(N'[schemaName].[ViewName]')
)
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
使用信息\u架构视图

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
使用系统sql\u模块

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
IF EXISTS (
   SELECT 1
   FROM sys.views
   WHERE OBJECT_ID = OBJECT_ID(N'[schemaName].[ViewName]')
)
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

使用sqlite:SQL错误:没有这样的表:信息\u模式。VIEWS@lutz:+1,因为缺少对SQLite的支持。您可能也想在此处加入
sys.schema
。错误-无效的对象名称“sys.views”。我正在查询master dbc如果您发现这是为了在视图的CREATE和ALTER之间做出决定(就像我所做的那样),那么这对视图不起作用-您必须删除视图*,然后创建它。IF EXISTS仍然可以很好地删除视图tho,所以谢谢!:)*当您这样做时,不要忘记任何权限。;)试试这个。如果它不存在,则创建视图(只是一个存根),然后更改该存根以放入更新。这样你就不必放弃它。想必你应该把被检查的视图的名称放在引号里?否则这将永远不起作用:)对于Microsoft SQL Server,我发现这是最有用的,因为在创建架构管理脚本时经常使用IF-EXISTS。在脚本中,您可能已经有了创建视图[dbo].[MyView],上面是用于复制和粘贴的最简单的片段。表也可以使用“u”,存储过程也可以使用“P”。如果OBJECT_ID('dbo.sprocName','P')不是NULL,则删除过程dbo.sprocName;GOI不知道这是否是2009年的最佳答案,但似乎是在2016年(尽管SQL Server 2016引入了一个更好的选项)。OBJECT_ID doc-这一个为您提供了所有对象类型: