Como posso verificar se existe uma exibição em um banco de dados?

127

Eu tenho algum código SQL que precisa ser executado se uma certa exibição existir em um banco de dados. Como eu verificaria se a Visualização existe?

EDIT: O DBMS usado é o Microsoft SQL Server

Draco
fonte

Respostas:

161

PARA SERVIDOR SQL

IF EXISTS(select * FROM sys.views where name = '')
kemiller2002
fonte
7
Você provavelmente quer se juntar sys.schemaaqui também.
Eric
Erro - nome de objeto inválido 'sys.views'. Eu estava consultando o mestre DB
Steam
Se você achou isso decidir entre CREATE e ALTER para uma view (como eu fiz), isso não funciona para VIEWs - você precisa DROP the VIEW * e depois CREATE. O IF EXISTS ainda funciona bem para DROPing the VIEW, então obrigado! :) * Não se esqueça de permissões quando o fizer. ;)
FrostbiteXIII
Tente isso. se ele não existir, crie a visualização (apenas um esboço) e altere-o para inserir suas atualizações. Dessa forma, você nunca precisará descartá-lo. structuredsight.com/2014/03/12/non-failing-scripts
kemiller2002
Presumivelmente, deve-se colocar o nome da visualização que está sendo verificada nas aspas? Caso contrário, isso nunca vai funcionar :)
Engenheiro invertida
138

Já existem muitas maneiras especificadas acima, mas uma das minhas favoritas está ausente.

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

ONDE nViewé o nome da visualização

ATUALIZAÇÃO 25/03/2017: como @hanesjw sugeriu descartar um uso do procedimento de armazenamento em Pvez de Vcomo o segundo argumento deOBJECT_ID

GO
IF OBJECT_ID( 'nProcedure', 'P' ) IS NOT NULL 
    DROP PROCEDURE dbo.sprocName; 
GO
zzlalani
fonte
4
Eu gosto deste. Você pode usar 'u' para tabelas também.
Phillip Senn
2
Ou 'P' para procedimentos armazenados. SE OBJECT_ID ('dbo.sprocName', 'P') NÃO É PROCEDIMENTO DE QUEDA NULO dbo.sprocName; GO
hanesjw 29/01
Não sei se essa foi a melhor resposta em 2009, mas parece ser em 2016 (embora o SQL Server 2016 esteja introduzindo uma opção ainda melhor).
19416 Eric Eric
1
OBJECT_ID doc msdn.microsoft.com/en-us/library/ms190328.aspx - e este fornece todos os tipos de objeto: msdn.microsoft.com/en-us/library/ms190324.aspx
Simon_Weaver
55

Essa é a maneira mais portátil e menos invasiva:

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

Editar: isso funciona no SQL Server e não exige que você participe sys.schemaspara obter o esquema da exibição. Isso é menos importante se tudo estiver bem dbo, mas se você estiver fazendo bom uso de esquemas, lembre-se disso.

Cada RDBMS tem sua própria maneira de verificar metadados como esse, mas information_schemana verdade é ANSI, e acho que Oracle e aparentemente SQLite são os únicos que não o suportam de alguma maneira.

Eric
fonte
3
Usando SQLite: Erro de SQL: nenhuma tabela: INFORMATION_SCHEMA.VIEWS
@lutz: +1, por falta de suporte no SQLite.
Alix Axel
18
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )
Kaal
fonte
Para o Microsoft SQL Server, acho isso o mais útil porque IF EXISTS é frequentemente usado ao criar scripts de gerenciamento de esquema. No script, você provavelmente já possui o CREATE ViEW [dbo]. [MyView] e o acima é esse snippet mais simples para copiar e colar.
Jimmy Bosse
15

Para as pessoas que verificam a existência abandonar, Viewuse este

Desde SQL Server 2016 CTP3que você pode usar novas DIE declarações em vez de grandes IFembalagens

sintaxe

VISTA DE QUEDA [SE EXISTE] [nome do esquema. ] view_name [..., n] [; ]

Inquerir :

DROP VIEW IF EXISTS view_name

Mais informações aqui

P ரதீப்
fonte
1

se for Oracle, você usaria a tabela "all_views".

Realmente depende dos seus dbms.

user158017
fonte
1

Se você deseja verificar a validade e consistência de todas as visualizações existentes, pode usar a seguinte 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
fonte
1

No 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
fonte
0

Para expandir a resposta 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
fonte
0

Você pode verificar a disponibilidade da visualização de várias maneiras

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

use 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

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