【发布时间】:2010-11-21 07:37:34
【问题描述】:
如果数据库中存在某个视图,我有一些需要执行的 SQL 代码。我将如何检查视图是否存在?
编辑:正在使用的 DBMS 是 Microsoft SQL Server
【问题讨论】:
标签: sql sql-server database stored-procedures view
如果数据库中存在某个视图,我有一些需要执行的 SQL 代码。我将如何检查视图是否存在?
编辑:正在使用的 DBMS 是 Microsoft SQL Server
【问题讨论】:
标签: sql sql-server database stored-procedures view
用于 SQL 服务器
IF EXISTS(select * FROM sys.views where name = '')
【讨论】:
sys.schema。
这是最便携、干扰最小的方式:
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 是唯一不以某种方式支持它的方法。
【讨论】:
如果是 Oracle,您将使用“all_views”表。
这真的取决于你的 dbms。
【讨论】:
扩展凯文的答案。
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
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
【讨论】:
对于检查存在以删除View 的人使用此
从 SQL Server 2016 CTP3 开始,您可以使用新的 DIE 语句代替大的 IF 包装器
语法
删除视图 [如果存在] [模式名称。 ] view_name [ ...,n ] [ ; ]
查询:
DROP VIEW IF EXISTS view_name
更多信息here
【讨论】:
在 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 服务器
使用 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
【讨论】: