2009-08-20 55 views

Respuesta

127

PARA SQL SERVER

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

Es probable que también quieras unirte a 'sys.schema' aquí. – Eric

+0

Error: nombre de objeto no válido 'sys.views'. Estaba consultando el maestro DB – Steam

+0

Si descubrió esto para decidir entre CREAR y ALTERAR una vista (como yo lo hice), esto no funciona para VIEWs - tiene que DEJAR caer la VISTA * y luego CREARLA. El IF EXISTS todavía funciona bien para DROP the VIEW tho, ¡así que gracias! :) * No olvide los permisos cuando lo haga. ;) – FrostbiteXIII

45

Ésta es la forma más portátil, menos intrusiva:

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

Editar: Esto funciona en SQL Server, y no requiere que se una a sys.schemas para obtener el esquema de la vista. Esto es menos importante si todo es dbo, pero si hace un buen uso de los esquemas, debe tenerlo en cuenta.

Cada RDBMS tiene su propia forma de verificar metadatos como este, pero information_schema es realmente ANSI, y creo que Oracle y aparentemente SQLite son los únicos que no lo admiten de alguna manera.

+3

Usando sqlite: error de SQL: ninguna tabla: INFORMATION_SCHEMA.VIEWS –

+0

@lutz: +1, por falta de soporte en SQLite. –

1

si es Oracle, debe usar la tabla "all_views".

Realmente depende de su dbms.

0

Para ampliar la respuesta 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)); 
     } 
    } 
17
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]')) 
+0

Para Microsoft SQL Server, considero que este es el más útil porque IF EXISTS se usa a menudo al crear scripts de administración de esquemas. En el script probablemente ya tenga CREATE ViEW [dbo]. [MyView] y lo anterior es el fragmento más simple para copiar y pegar. –

1

Si desea comprobar la validez y consistencia de todos los puntos de vista existentes, puede utilizar la siguiente consulta

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 '[email protected] 
begin try 
exec (@cmd) 
end try 
begin catch 
print 'Error: The view '[email protected]+' is corrupted .' 
end catch 
FETCH NEXT FROM check_cursor 
INTO @viewName 
END 
CLOSE check_cursor; 
DEALLOCATE check_cursor; 
110

Aunque ya hay muchas maneras especificadas anteriormente, pero uno de mis favoritos Está perdido..

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

DONDE nView es el nombre de vista

ACTUALIZACIÓN 25/03/2017: como @hanesjw sugirió dejar caer una tienda Procedimiento P uso en lugar de V como el segundo argumento de OBJECT_ID

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

También acepta el esquema. 'object_id (N'dbo.View ', N'v)' –

+4

Me gusta este. También puedes usar 'u' para las tablas. –

+2

O 'P' para procedimientos almacenados. SI OBJECT_ID ('dbo.sprocName', 'P') NO ES NULO DROP PROCEDURE dbo.sprocName; GO – hanesjw

12

Para las personas que comprueban la existencia de una caída View utilizan este

De SQL Server 2016 CTP3 puede utilizar nuevos DIE declaraciones en vez de grandes IF envoltorios

sintaxis

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

Consulta:

DROP VIEW IF EXISTS view_name 

Más información here

0

en 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 
Cuestiones relacionadas