У меня есть код SQL, который должен быть выполнен, если определенный вид существует в базе данных. Как я могу проверить, существует ли представление?
EDIT: Используемая СУБД - это Microsoft SQL Server
У меня есть код SQL, который должен быть выполнен, если определенный вид существует в базе данных. Как я могу проверить, существует ли представление?
EDIT: Используемая СУБД - это Microsoft SQL Server
ДЛЯ SQL SERVER
IF EXISTS(select * FROM sys.views where name = '')
Хотя уже существует много способов, указанных выше, но один из моих любимых отсутствует.
GO
IF OBJECT_ID('nView', 'V') IS NOT NULL
DROP VIEW nView;
GO
WHERE nView - это имя представления
UPDATE 2017-03-25:, поскольку @hanesjw предложил отказаться от процедуры Store использовать 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'
Изменить: это работает на SQL Server, и для этого не требуется присоединение к sys.schemas, чтобы получить схему представления. Это менее важно, если все dbo, но если вы хорошо используете схемы, тогда вы должны помнить об этом.
Каждая РСУБД имеет свой собственный небольшой способ проверки метаданных, подобных этому, но information_schema на самом деле является ANSI, и я думаю, что Oracle и, по-видимому, SQLite являются единственными, которые каким-то образом не поддерживают его.
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )
Для людей, проверяющих существование drop View, используйте этот
Из SQL Server 2016 CTP3 вы можете использовать новые операторы DIE вместо больших IF оберток
синтаксис
DROP VIEW [IF EXISTS] [имя_схемы. ] view_name [..., n] [; ]
Запрос:
DROP VIEW IF EXISTS view_name
Подробнее здесь
если это Oracle, вы будете использовать таблицу "all_views".
Это действительно зависит от ваших dbms.
Если вы хотите проверить правильность и согласованность всех существующих представлений, вы можете использовать следующий запрос
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 '[email protected]
begin try
exec (@cmd)
end try
begin catch
print 'Error: The view '[email protected]+' 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