Wie kann ich überprüfen, ob eine Ansicht in einer Datenbank vorhanden ist?


127

Ich habe SQL-Code, der ausgeführt werden muss, wenn eine bestimmte Ansicht in einer Datenbank vorhanden ist. Wie würde ich prüfen, ob die Ansicht vorhanden ist?

BEARBEITEN: Das verwendete DBMS ist Microsoft SQL Server

Antworten:


161

FÜR SQL Server

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

7
Sie möchten wahrscheinlich auch hier mitmachen sys.schema.
Eric

Fehler - Ungültiger Objektname 'sys.views'. Ich habe Master DB
Steam

Wenn Sie festgestellt haben, dass Sie sich für eine Ansicht zwischen CREATE und ALTER entscheiden (wie ich), funktioniert dies für VIEWs nicht - Sie müssen die VIEW * fallen lassen und dann CREATE erstellen. Das IF EXISTS funktioniert immer noch einwandfrei, um die Ansicht zu deaktivieren. Vielen Dank! :) * Vergessen Sie dabei keine Berechtigungen. ;)
FrostbiteXIII

Versuche dies. Wenn es nicht vorhanden ist, erstellen Sie die Ansicht (nur einen Stub) und ändern Sie diesen Stub, um Ihre Updates einzufügen. Auf diese Weise müssen Sie ihn nie löschen. strukturiertight.com/2014/03/12/non-failing-scripts
kemiller2002

Vermutlich sollte man den Namen der zu prüfenden Ansicht in die Anführungszeichen setzen? Andernfalls wird dies nie funktionieren :)
Reversed Engineer

138

Es gibt bereits viele Möglichkeiten, die oben angegeben wurden, aber eine meiner Favoriten fehlt.

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

WO nViewist der Name der Ansicht

UPDATE 2017-03-25: wie @hanesjw vorgeschlagen hat, eine Speicherprozedur zu löschen, Panstatt Vals zweites Argument vonOBJECT_ID

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

4
Ich mag diesen. Sie können 'u' auch für Tabellen verwenden.
Phillip Senn

2
Oder 'P' für gespeicherte Prozeduren. WENN OBJECT_ID ('dbo.sprocName', 'P') NICHT NULL ist DROP PROCEDURE dbo.sprocName; GO
Hanesjw

Ich weiß nicht, ob dies die beste Antwort im Jahr 2009 war, aber es scheint im Jahr 2016 zu sein (obwohl SQL Server 2016 eine noch bessere Option einführt).
Eric J.


55

Dies ist der tragbarste und am wenigsten aufdringliche Weg:

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

Bearbeiten: Dies funktioniert unter SQL Server und erfordert nicht, dass Sie beitreten sys.schemas, um das Schema der Ansicht abzurufen. Dies ist weniger wichtig, wenn alles vorhanden ist dbo, aber wenn Sie Schemata gut nutzen, sollten Sie dies berücksichtigen.

Jedes RDBMS hat seine eigene kleine Möglichkeit, solche Metadaten zu überprüfen, ist aber information_schematatsächlich ANSI, und ich denke, Oracle und anscheinend SQLite sind die einzigen, die es in irgendeiner Weise nicht unterstützen.


3
Verwenden von SQLite: SQL-Fehler: Keine solche Tabelle: INFORMATION_SCHEMA.VIEWS

@lutz: +1, mangels Unterstützung für SQLite.
Alix Axel

18
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )

Für Microsoft SQL Server finde ich dies am nützlichsten, da IF EXISTS häufig beim Erstellen von Schemaverwaltungsskripten verwendet wird. Im Skript haben Sie wahrscheinlich bereits CREATE ViEW [dbo]. [MyView] und das obige ist das einfachste Snippet zum Kopieren und Einfügen.
Jimmy Bosse

15

ViewVerwenden Sie dies für Personen, die die Existenz überprüfen, um sie fallen zu lassen

Von können SQL Server 2016 CTP3Sie neue DIE- Anweisungen anstelle von großen IFWrappern verwenden

Syntax

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

Abfrage:

DROP VIEW IF EXISTS view_name

Mehr Infos hier


1

Wenn es Oracle ist, würden Sie die Tabelle "all_views" verwenden.

Es hängt wirklich von Ihren DBMS ab.


1

Wenn Sie die Gültigkeit und Konsistenz aller vorhandenen Ansichten überprüfen möchten, können Sie die folgende Abfrage verwenden

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

IN 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

Um Kevins Antwort zu erweitern.

    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

Sie können die Verfügbarkeit der Ansicht auf verschiedene Arten überprüfen

FÜR SQL Server

benutze 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

benutze sysobjects

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

Verwenden Sie sys.views

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

Verwenden Sie INFORMATION_SCHEMA.VIEWS

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

Verwenden Sie OBJECT_ID

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

Verwenden Sie sys.sql_modules

IF EXISTS (
   SELECT 1
   FROM   sys.sql_modules
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
   PRINT 'View Exists'
END
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.