it-swarm.com.de

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

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

BEARBEITEN: Das verwendete DBMS ist Microsoft SQL Server

119
Draco

FÜR SQL-SERVER

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

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

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

WHERE nView ist der Name der Sicht

UPDATE 2017-03-25: as @hanesjw hat vorgeschlagen, ein Store-Verfahren zu löschen. Verwenden Sie P anstelle von V als zweites Argument von OBJECT_ID.

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

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 auf SQL Server, und Sie müssen nicht sys.schemas beitreten, um das Schema der Ansicht zu erhalten. Dies ist weniger wichtig, wenn alles dbo ist, aber wenn Sie Schemata gut nutzen, sollten Sie dies berücksichtigen.

Jedes RDBMS hat seine eigene kleine Methode, Metadaten wie diese zu überprüfen, aber information_schema ist eigentlich ANSI, und ich denke, dass Oracle und anscheinend SQLite die einzigen sind, die dies nicht unterstützen.

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

Für Personen, die die Existenz überprüfen, um View zu löschen, verwenden Sie diese Option 

Von SQL Server 2016 CTP3 aus können Sie neue DIE -Anweisungen anstelle großer IF-Wrapper verwenden

syntax

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

Abfrage:

DROP VIEW IF EXISTS view_name

Mehr Infos hier

13

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 '[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;

wenn es sich um Oracle handelt, würden Sie die Tabelle "all_views" verwenden. 

Es hängt wirklich von Ihren Dbms ab.

1
user158017

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
UJS

Um auf Kevins Antwort einzugehen.

    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
joe