¿Cómo puedo verificar si existe una vista en una base de datos?

127

Tengo un código SQL que debe ejecutarse si existe una vista determinada en una base de datos. ¿Cómo haría para verificar si existe la Vista?

EDITAR: El DBMS que se usa es Microsoft SQL Server

Draco
fuente

Respuestas:

161

PARA SERVIDOR SQL

IF EXISTS(select * FROM sys.views where name = '')
kemiller2002
fuente
77
Probablemente quieras unirte sys.schemaaquí también.
Eric
Error: nombre de objeto no válido 'sys.views'. Estaba consultando el DB maestro
Steam el
Si descubrió que esto decide entre CREAR y ALTERAR para una vista (como lo hice yo), esto no funciona para las VISTAS: debe BAJAR la VISTA * y luego CREARla. El IF EXISTS todavía funciona bien para DROPing the VIEW tho, ¡así que gracias! :) * No te olvides de ningún permiso cuando lo hagas. ;)
FrostbiteXIII
Prueba esto. si no existe, cree la vista (solo un apéndice) y luego modifique ese apéndice para poner sus actualizaciones. De esa manera, nunca tendrá que soltarlo. structuredsight.com/2014/03/12/non-failing-scripts
kemiller2002
Presumiblemente, uno debe poner el nombre de la vista que se verifica en las comillas. De lo contrario, esto nunca funcionará :)
Ingeniero invertido
138

Ya hay muchas formas especificadas anteriormente, pero falta una de mis favoritas ...

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

DONDE nViewestá el nombre de la vista

ACTUALIZACIÓN 2017-03-25: como @hanesjw sugirió eliminar un uso de Procedimiento de tienda en Plugar de Vcomo el segundo argumento deOBJECT_ID

GO
IF OBJECT_ID( 'nProcedure', 'P' ) IS NOT NULL 
    DROP PROCEDURE dbo.sprocName; 
GO
zzlalani
fuente
44
Me gusta este. Puede usar 'u' para tablas también.
Phillip Senn
2
O 'P' para procedimientos almacenados. SI OBJECT_ID ('dbo.sprocName', 'P') NO ES NULL PROCEDIMIENTO DE GOTA dbo.sprocName; GO
hanesjw
No sé si esta fue la mejor respuesta en 2009, pero parece ser en 2016 (aunque SQL Server 2016 presenta una opción aún mejor).
Eric J.
1
OBJECT_ID doc msdn.microsoft.com/en-us/library/ms190328.aspx , y este le brinda todos los tipos de objetos: msdn.microsoft.com/en-us/library/ms190324.aspx
Simon_Weaver
55

Esta es la forma más portátil y 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 sys.schemaspara obtener el esquema de la vista. Esto es menos importante si todo lo es dbo, pero si estás haciendo un buen uso de los esquemas, entonces debes tenerlo en cuenta.

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

Eric
fuente
3
Usando sqlite: Error de SQL: no existe esa tabla: INFORMATION_SCHEMA.VIEWS
@lutz: +1, por falta de soporte en SQLite.
Alix Axel
18
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )
Kaal
fuente
Para Microsoft SQL Server, esto es lo 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 este fragmento más simple para copiar y pegar.
Jimmy Bosse
15

Para las personas que comprueban la existencia para descartar, Viewuse este

Desde SQL Server 2016 CTP3usted puede usar nuevas declaraciones DIE en lugar de grandes IFenvoltorios

sintaxis

VISTA DE GOTA [SI EXISTE] [nombre_esquema. ] view_name [..., n] [; ]

Consulta :

DROP VIEW IF EXISTS view_name

Más información aquí.

P ரதீப்
fuente
1

si es Oracle, usaría la tabla "all_views".

Realmente depende de tus dbms.

usuario158017
fuente
1

Si desea verificar la validez y consistencia de todas las vistas existentes, puede usar 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 '+@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
fuente
1

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
UJS
fuente
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));
        }
    }
joe
fuente
0

Puede verificar la disponibilidad de la vista de varias maneras

PARA SERVIDOR SQL

use 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

usar sysobjects

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

use sys.views

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

use INFORMATION_SCHEMA.VIEWS

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

usar OBJECT_ID

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

use 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
fuente