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

Draco
la source

Réponses:

161

POUR SQL SERVER

IF EXISTS(select * FROM sys.views where name = '')
kemiller2002
la source
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
zzlalani
la source
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.
1
OBJECT_ID doc msdn.microsoft.com/en-us/library/ms190328.aspx - et celui-ci vous donne tous les types d'objets: msdn.microsoft.com/en-us/library/ms190324.aspx
Simon_Weaver
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.

Eric
la source
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]') )
Kaal
la source
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

P ரதீப்
la source
1

si c'est Oracle, vous utiliserez la table "all_views".

Cela dépend vraiment de vos dbms.

utilisateur158017
la source
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;
Sriwantha Attanayake
la source
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
UJS
la source
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));
        }
    }
Joe
la source
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
Reza Jenabi
la source