Comment puis-je vérifier si une vue existe dans une base de données?


127

J'ai du code SQL qui doit être exécuté si une certaine vue existe dans une base de données. Comment procéder pour vérifier si la vue existe?

EDIT: Le SGBD utilisé est Microsoft SQL Server

Réponses:


161

POUR SQL SERVER

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

7
Vous voudrez probablement vous joindre sys.schemaici aussi.
Eric

Erreur -Nom d'objet invalide 'sys.views'. J'étais en train d'interroger master DB
Steam

Si vous avez trouvé cela pour décider entre un CREATE et un ALTER pour une vue (comme je l'ai fait), cela ne fonctionne pas pour les VIEWs - vous devez DROP the VIEW * puis le CREATE. IF EXISTS fonctionne toujours bien pour DROPING the VIEW, alors merci! :) * N'oubliez pas les autorisations lorsque vous le faites. ;)
FrostbiteXIII

Essaye ça. s'il n'existe pas, créez la vue (juste un stub) puis modifiez ce stub pour y mettre vos mises à jour. De cette façon, vous n'aurez jamais à le supprimer. Structuredsight.com/2014/03/12/non-failing-scripts
kemiller2002

On devrait probablement mettre le nom de la vue en cours de vérification entre guillemets? Sinon, cela ne fonctionnera jamais :)
Ingénieur inversé

138

Il y a déjà de nombreuses façons spécifiées ci-dessus mais l'une de mes préférées manque.

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

WHERE nViewest le nom de la vue

MISE À JOUR 25/03/2017: comme @hanesjw a suggéré de supprimer une procédure de magasin, utilisez Pplutôt Vque comme deuxième argument deOBJECT_ID

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

4
J'aime celui la. Vous pouvez également utiliser «u» pour les tableaux.
Phillip Senn

2
Ou «P» pour les procédures stockées. IF OBJECT_ID ('dbo.sprocName', 'P') N'EST PAS NULL DROP PROCEDURE dbo.sprocName; GO
hanesjw

Je ne sais pas si c'était la meilleure réponse en 2009, mais cela semble être en 2016 (bien que SQL Server 2016 présente une option encore meilleure).
Eric J.


55

C'est le moyen le plus portable et le moins intrusif:

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

Edit: cela fonctionne sur SQL Server et il n'est pas nécessaire que vous vous joigniez à sys.schemaspour obtenir le schéma de la vue. C'est moins important si tout l'est dbo, mais si vous faites bon usage des schémas, gardez cela à l'esprit.

Chaque SGBDR a son propre petit moyen de vérifier les métadonnées comme celui-ci, mais information_schemac'est en fait ANSI, et je pense qu'Oracle et apparemment SQLite sont les seuls à ne pas le prendre en charge d'une manière ou d'une autre.


3
Utilisation de sqlite: erreur SQL: aucune table de ce type: INFORMATION_SCHEMA.VIEWS

@lutz: +1, faute de support sur SQLite.
Alix Axel

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

Pour Microsoft SQL Server, je trouve cela le plus utile car IF EXISTS est souvent utilisé lors de la création de scripts de gestion de schéma. Dans le script, vous avez probablement déjà le CREATE ViEW [dbo]. [MyView] et ce qui précède est cet extrait le plus simple pour copier et coller.
Jimmy Bosse

15

Pour les personnes qui vérifient l'existence pour abandonner, Viewutilisez ceci

De, SQL Server 2016 CTP3vous pouvez utiliser de nouvelles instructions DIE au lieu de gros IFwrappers

syntaxe

DROP VIEW [IF EXISTS] [nom_schéma. ] nom_vue [..., n] [; ]

Requete :

DROP VIEW IF EXISTS view_name

Plus d'infos ici



1

Si vous souhaitez vérifier la validité et la cohérence de toutes les vues existantes, vous pouvez utiliser la requête suivante

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

DANS 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

Pour développer la réponse de 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

Vous pouvez vérifier la disponibilité de la vue de différentes manières

POUR SQL SERVER

utiliser 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

utiliser sysobjects

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

utiliser sys.views

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

utiliser INFORMATION_SCHEMA.VIEWS

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

utiliser OBJECT_ID

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

utiliser sys.sql_modules

IF EXISTS (
   SELECT 1
   FROM   sys.sql_modules
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
   PRINT 'View Exists'
END
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.