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
POUR SQL SERVER
IF EXISTS(select * FROM sys.views where name = '')
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
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.
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )
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
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;
si c'est Oracle, vous utiliseriez la table "all_views".
Cela dépend vraiment de votre dbms.
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
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));
}
}