¿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

Respuestas:


161

PARA SERVIDOR SQL

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

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

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.


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.


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]') )

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í.



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;

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

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));
        }
    }

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.