Як я можу перевірити, чи існує перегляд у базі даних?


127

У мене є деякий код SQL, який потрібно виконати, якщо певний перегляд існує в базі даних. Як би я міг перевірити, чи існує Перегляд?

EDIT: СУБД, що використовується, - це Microsoft SQL Server

Відповіді:


161

ДЛЯ SQL SERVER

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

7
Ви, мабуть, хочете і sys.schemaтут долучитися .
Ерік

Помилка - Недійсне ім'я об'єкта 'sys.views'. Я запитував майстра DB
Steam

Якщо ви визначили це для вирішення між CREATE та ALTER для перегляду (як я це зробив), це не працює для VIEWs - вам потрібно скинути VIEW *, а потім створити його. ЯКЩО ВІДПОВІДУЄТЬСЯ все ще чудово працює для ВИГОТУВАННЯ ПОГЛЯДУ Тхо, тому дякую! :) * Не забувайте про будь-які дозволи, коли ви це робите. ;)
ОбмороженняXIII

Спробуйте це. якщо його немає, створіть подання (просто заглушку), а потім змініть цю заглушку, щоб розмістити свої оновлення. Таким чином, вам ніколи не доведеться її скидати. structureuredsight.com/2014/03/12/non-failing-scripts
kemiller2002

Імовірно, слід вказати назву виду, що перевіряється, у лапках? Інакше це ніколи не вийде :)
Інвертор Інженер

138

Вище вказано багато способів, але одного з моїх улюблених немає.

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

ДЕ nView- назва зору

ОНОВЛЕННЯ 2017-03-25: як @hanesjw запропонував відмовитись від використання процедури Store, Pа не Vяк другого аргументуOBJECT_ID

GO
IF OBJECT_ID( 'nProcedure', 'P' ) IS NOT NULL 
    DROP PROCEDURE dbo.sprocName; 
GO

4
Мені це подобається. Ви також можете використовувати "u" для таблиць.
Філіп Сенн

2
Або "P" для збережених процедур. ЯКЩО OBJECT_ID ('dbo.sprocName', 'P') НЕ НУЛЬНИЙ ПРОЦЕДУРА ДРОПУВАННЯ dbo.sprocName; GO
hanesjw

Я не знаю, чи була це найкраща відповідь у 2009 році, але, здається, це був у 2016 році (хоча SQL Server 2016 пропонує ще кращий варіант).
Ерік Дж.

1
OBJECT_ID doc msdn.microsoft.com/en-us/library/ms190328.aspx - і цей дає вам усі типи об’єктів: msdn.microsoft.com/en-us/library/ms190324.aspx
Simon_Weaver

55

Це самий портативний, найменш настирливий спосіб:

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

Редагувати: це працює на SQL Server, і це не вимагає від вас приєднання, sys.schemasщоб отримати схему подання. Це менш важливо, якщо все є dbo, але якщо ви добре використовуєте схеми, то вам слід пам’ятати про це.

У кожного RDBMS є свій маленький спосіб перевірки таких метаданих, але information_schemaнасправді ANSI, і я думаю, що Oracle і, очевидно, SQLite є єдиними, хто не підтримує їх якось.


3
Використання sqlite: помилка SQL: немає такої таблиці: INFORMATION_SCHEMA.VIEWS

@lutz: +1, через відсутність підтримки в SQLite.
Алікс Аксель

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

Для Microsoft SQL Server я вважаю це найбільш корисним, оскільки IF EXISTS часто використовується при створенні сценаріїв управління схемами. У сценарії, ймовірно, вже є CREATE VIEW [dbo]. [MyView] і вище це найпростіший фрагмент для копіювання та вставки.
Джиммі Боссе

15

Люди, які перевіряють існування, відмовляються від Viewвикористання цього

З SQL Server 2016 CTP3ви можете використовувати нові DIE заяви замість великих IFобгорток

синтаксис

ПЕРЕГЛЯД ДРОПУ [ЯКЩО ВИНАЄТЬСЯ] [схема_назва. ] view_name [..., n] [; ]

Запит:

DROP VIEW IF EXISTS view_name

Більше інформації тут



1

Якщо ви хочете перевірити дійсність та узгодженість усіх існуючих представлень даних, ви можете скористатися наступним запитом

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

IN 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

Щоб розширити відповідь Кевіна.

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

0

Ви можете перевірити наявність перегляду різними способами

ДЛЯ SQL SERVER

використовувати sys.objects

IF EXISTS(
   SELECT 1
   FROM   sys.objects
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
          AND Type_Desc = 'VIEW'
)
BEGIN
    PRINT 'View Exists'
END

використовувати сисобекти

IF NOT EXISTS (
   SELECT 1
   FROM   sysobjects
   WHERE  NAME = '[schemaName].[ViewName]'
          AND xtype = 'V'
)
BEGIN
    PRINT 'View Exists'
END

використовувати sys.views

IF EXISTS (
   SELECT 1
   FROM sys.views
   WHERE OBJECT_ID = OBJECT_ID(N'[schemaName].[ViewName]')
)
BEGIN
    PRINT 'View Exists'
END

використовувати INFORMATION_SCHEMA.VIEWS

IF EXISTS (
   SELECT 1
   FROM   INFORMATION_SCHEMA.VIEWS
   WHERE  table_name = 'ViewName'
          AND table_schema = 'schemaName'
)
BEGIN
    PRINT 'View Exists'
END

використовувати OBJECT_ID

IF EXISTS(
   SELECT OBJECT_ID('ViewName', 'V')
)
BEGIN
    PRINT 'View Exists'
END

використовувати sys.sql_modules

IF EXISTS (
   SELECT 1
   FROM   sys.sql_modules
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
   PRINT 'View Exists'
END
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.