Как проверить, существует ли представление в базе данных?
У меня есть код SQL, который необходимо выполнить, если в базе данных существует определенное представление. Как бы я проверил, существует ли представление?
EDIT: используется СУБД Microsoft SQL Server
9 ответов
хотя есть уже много способов, указанных выше, но один из моих любимых отсутствует..
GO
IF OBJECT_ID('nView', 'V') IS NOT NULL
DROP VIEW nView;
GO
здесь nView
это имя view
обновление 2017-03-25: как @hanesjw предложил отказаться от использования процедуры хранения P
вместо V
как второй аргумент OBJECT_ID
GO
IF OBJECT_ID( 'nProcedure', 'P' ) IS NOT NULL
DROP PROCEDURE dbo.sprocName;
GO
Это самый портативный, наименее навязчивый способ:
select
count(*)
from
INFORMATION_SCHEMA.VIEWS
where
table_name = 'MyView'
and table_schema = 'MySchema'
Edit: это работает на SQL Server, и это не требует присоединения к sys.schemas
чтобы получить схему представления. Это менее важно, если все dbo
, но если вы хорошо используете схемы, то вы должны иметь это в виду.
каждая СУБД имеет свой собственный маленький способ проверки метаданных, как это, но information_schema
на самом деле ANSI, и я думаю, что Oracle и, по-видимому, SQLite являются единственными те, которые не поддерживают его каким-то образом.
для людей, проверяющих наличие рака View
использовать
С SQL Server 2016 CTP3
вы можете использовать new умереть заявления вместо big IF
фантики
синтаксис
DROP VIEW [ если существует ] [ schema_name . ] имя_представления [ ...,n ] [ ;]
запрос :
DROP VIEW IF EXISTS view_name
Подробнее здесь
Если это Oracle, вы должны использовать таблицу "all_views".
Это действительно зависит от вашей СУБД.
Если вы хотите проверить правильность и согласованность всех существующих представлений, вы можете использовать следующий запрос
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;
чтобы расширить ответ Кевина.
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));
}
}
в 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