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

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

EDIT: Используемая СУБД - это Microsoft SQL Server

Ответ 1

ДЛЯ SQL SERVER

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

Ответ 2

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

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

Ответ 3

Это самый портативный, наименее навязчивый способ:

select
    count(*)
from
    INFORMATION_SCHEMA.VIEWS
where
    table_name = 'MyView'
    and table_schema = 'MySchema'

Изменить: это работает на SQL Server, и для этого не требуется присоединение к sys.schemas, чтобы получить схему представления. Это менее важно, если все dbo, но если вы хорошо используете схемы, тогда вы должны помнить об этом.

Каждая РСУБД имеет свой собственный небольшой способ проверки метаданных, подобных этому, но information_schema на самом деле является ANSI, и я думаю, что Oracle и, по-видимому, SQLite являются единственными, которые каким-то образом не поддерживают его.

Ответ 4

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

Ответ 5

Для людей, проверяющих существование drop View, используйте этот

Из SQL Server 2016 CTP3 вы можете использовать новые операторы DIE вместо больших IF оберток

синтаксис

DROP VIEW [IF EXISTS] [имя_схемы. ] view_name [..., n] [; ]

Запрос:

DROP VIEW IF EXISTS view_name

Подробнее здесь

Ответ 6

если это Oracle, вы будете использовать таблицу "all_views".

Это действительно зависит от ваших dbms.

Ответ 7

Если вы хотите проверить правильность и согласованность всех существующих представлений, вы можете использовать следующий запрос

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;

Ответ 8

Чтобы расширить ответ Кевина.

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

Ответ 9

В 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