web-dev-qa-db-fra.com

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

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

EDIT: le SGBD utilisé est Microsoft SQL Server

119
Draco

POUR SQL SERVER

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

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

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

O nView est le nom de la vue

UPDATE 2017-03-25: comme @hanesjw a suggéré de supprimer une procédure de stockage, utilisez P au lieu de V comme deuxième argument de OBJECT_ID

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

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

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

Edit: Cela fonctionne sur SQL Server et vous n'avez pas besoin de vous connecter à sys.schemas pour obtenir le schéma de la vue. Ceci est moins important si tout est dbo, mais si vous utilisez bien les schémas, gardez cela à l'esprit.

Chaque SGBDR a son propre moyen de vérifier les métadonnées de cette manière, mais information_schema est en réalité ANSI, et je pense que Oracle et apparemment SQLite sont les seuls à ne pas le prendre en charge de quelque manière que ce soit.

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

Pour les personnes vérifiant l’existence de Drop View, utilisez cette commande. 

À partir de SQL Server 2016 CTP3, vous pouvez utiliser les nouvelles instructions DIE au lieu de grands wrappers IF

syntaxe

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

Requête:

DROP VIEW IF EXISTS view_name

Plus d'infos ici

13
Pரதீப்

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

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

Cela dépend vraiment de votre dbms.

1
user158017

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
UJS

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
joe