Как я могу проверить, существует ли представление в базе данных? - PullRequest
120 голосов
/ 20 августа 2009

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

РЕДАКТИРОВАТЬ: СУБД используется Microsoft SQL Server

Ответы [ 9 ]

150 голосов
/ 20 августа 2009

ДЛЯ СЕРВЕРА SQL

IF EXISTS(select * FROM sys.views where name = '')
127 голосов
/ 12 декабря 2013

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

GO
IF OBJECT_ID('nView', 'V') IS NOT NULL
    DROP VIEW nView;
GO

ГДЕ nView это имя вида

ОБНОВЛЕНИЕ 2017-03-25: , поскольку @hanesjw предложил отбросить процедуру хранения, используя P вместо V в качестве второго аргумента OBJECT_ID

GO
IF OBJECT_ID( 'nProcedure', 'P' ) IS NOT NULL 
    DROP PROCEDURE dbo.sprocName; 
GO
49 голосов
/ 20 августа 2009

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

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

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

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

17 голосов
/ 04 июля 2013
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )
13 голосов
/ 22 ноября 2015

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

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

синтаксис

DROP VIEW [ЕСЛИ СУЩЕСТВУЕТ] [имя_схемы. ] view_name [..., n] [; ]

Запрос:

DROP VIEW IF EXISTS view_name

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

1 голос
/ 31 июля 2013

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

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;
1 голос
/ 20 августа 2009

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

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

0 голосов
/ 27 сентября 2017

В 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
0 голосов
/ 20 декабря 2011

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

    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));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...