Come posso verificare se esiste una vista in un database?


127

Ho del codice SQL che deve essere eseguito se esiste una certa Vista in un database. Come farei per verificare se la vista esiste?

EDIT: Il DBMS in uso è Microsoft SQL Server

Risposte:


161

PER SQL SERVER

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

7
Probabilmente vuoi unirti anche sys.schemaqui.
Eric,

Errore -Nome oggetto non valido 'sys.views'. Stavo interrogando il master DB
Steam il

Se hai trovato questo per decidere tra un CREATE e ALTER per una vista (come ho fatto io), questo non funziona per le VISUALIZZA - devi GOCCIARE la VISUALIZZAZIONE * e poi CREARLA. IF EXISTS funziona ancora bene per DROPing the VIEW tho, quindi grazie! :) * Non dimenticare le autorizzazioni quando lo fai. ;)
FrostbiteXIII,

Prova questo. se non esiste, crea la vista (solo uno stub) e quindi modifica lo stub per inserire gli aggiornamenti. In questo modo non dovrai mai rilasciarlo. strutturatosight.com/2014/03/12/non-failing-scripts
kemiller2002

Presumibilmente si dovrebbe mettere il nome della vista da controllare tra virgolette? Altrimenti non funzionerà mai :)
Ingegnere invertito,

138

Ci sono già molti modi sopra specificati ma manca uno dei miei preferiti ..

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

DOVE nView è il nome della vista

AGGIORNAMENTO 2017-03-25: come @hanesjw ha suggerito di eliminare l'uso di una procedura di archiviazione Panziché Vcome secondo argomento diOBJECT_ID

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

4
Mi piace questa. Puoi usare 'u' anche per le tabelle.
Phillip Senn,

2
O 'P' per le stored procedure. SE OBJECT_ID ('dbo.sprocName', 'P') NON È PROCEDURA DI GOCCIA NULL dbo.sprocName; GO
hanesjw,

Non so se questa sia stata la migliore risposta nel 2009, ma sembra essere nel 2016 (sebbene SQL Server 2016 stia introducendo un'opzione ancora migliore).
Eric J.


55

Questo è il modo più portatile e meno invadente:

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

Modifica: funziona su SQL Server e non richiede la partecipazione sys.schemasper ottenere lo schema della vista. Questo è meno importante se tutto èdbo , ma se stai facendo buon uso degli schemi, dovresti tenerlo a mente.

Ogni RDBMS ha il suo piccolo modo di controllare metadati come questo, ma in information_schemarealtà è ANSI, e penso che Oracle e apparentemente SQLite siano gli unici che non lo supportano in qualche modo.


3
Utilizzo di sqlite: errore SQL: nessuna tabella di questo tipo: INFORMATION_SCHEMA.VIEWS

@lutz: +1, per mancanza di supporto su SQLite.
Alix Axel,

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

Per Microsoft SQL Server, trovo questo il più utile perché IF EXISTS viene spesso utilizzato durante la creazione di script di gestione dello schema. Nello script probabilmente hai già CREATE ViEW [dbo]. [MyView] e quanto sopra è questo frammento più semplice per copia e incolla.
Jimmy Bosse,

15

Per le persone che controllano l'esistenza di cadere Viewutilizzare questo

Da SQL Server 2016 CTP3te puoi usare nuove istruzioni DIE invece di grandi IFwrapper

sintassi

DROP VIEW [IF EXISTS] [schema_name. ] view_name [..., n] [; ]

Query:

DROP VIEW IF EXISTS view_name

Maggiori informazioni qui


1

se è Oracle dovresti usare la tabella "all_views".

Dipende davvero dal tuo dbms.


1

Se si desidera verificare la validità e la coerenza di tutte le viste esistenti, è possibile utilizzare la seguente query

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

Per espandere la risposta di Kevin.

    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

È possibile verificare la disponibilità della vista in vari modi

PER SQL SERVER

usa 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

usa gli oggetti di sistema

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

usa sys.views

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

usa INFORMATION_SCHEMA.VIEWS

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

usa OBJECT_ID

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

usa sys.sql_modules

IF EXISTS (
   SELECT 1
   FROM   sys.sql_modules
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
   PRINT 'View Exists'
END
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.