Как проверить, существует ли представление в базе данных?

У меня есть код SQL, который необходимо выполнить, если в базе данных существует определенное представление. Как бы я проверил, существует ли представление?

EDIT: используется СУБД Microsoft SQL Server

9 ответов


ДЛЯ SQL SERVER

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

хотя есть уже много способов, указанных выше, но один из моих любимых отсутствует..

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 являются единственными те, которые не поддерживают его каким-то образом.


if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )

для людей, проверяющих наличие рака 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