Jak mogę sprawdzić, czy widok istnieje w bazie danych?

127

Mam kod SQL, który musi zostać wykonany, jeśli określony widok istnieje w bazie danych. Jak powinienem sprawdzić, czy widok istnieje?

EDYCJA: używany DBMS to Microsoft SQL Server

Draco
źródło

Odpowiedzi:

161

DLA SERWERA SQL

IF EXISTS(select * FROM sys.views where name = '')
kemiller2002
źródło
7
Prawdopodobnie też chcesz sys.schematu dołączyć .
Eric
Błąd - nieprawidłowa nazwa obiektu „sys.views”. Zapytałem mistrza DB
Steam
Jeśli znalazłeś to, aby zdecydować między CREATE a ALTER dla widoku (tak jak ja), to nie działa dla VIEWs - musisz DROP the VIEW *, a następnie STWÓRZ. IF ISTNIEJE nadal działa dobrze w przypadku OPUSZCZANIA WIDOKU, więc dzięki! :) * Nie zapomnij o uprawnieniach. ;)
FrostbiteXIII
Spróbuj tego. jeśli nie istnieje, utwórz widok (tylko kod pośredniczący), a następnie zmień go, aby umieścić w nim aktualizacje. W ten sposób nigdy nie będziesz musiał go upuszczać. structuredsight.com/2014/03/12/non-failing-scripts
kemiller2002
Przypuszczalnie należałoby umieścić w cudzysłowie nazwę sprawdzanego widoku? Inaczej to nigdy nie zadziała :)
Reversed Engineer
138

Istnieje już wiele sposobów określonych powyżej, ale brakuje jednego z moich ulubionych.

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

GDZIE nViewto nazwa widoku

UPDATE 2017-03-25: jak @hanesjw zasugerował, aby porzucić użycie procedury sklepu Pzamiast Vjako drugiego argumentuOBJECT_ID

GO
IF OBJECT_ID( 'nProcedure', 'P' ) IS NOT NULL 
    DROP PROCEDURE dbo.sprocName; 
GO
zzlalani
źródło
4
Podoba mi się ten. Możesz również użyć litery „u” dla tabel.
Phillip Senn
2
Lub „P” dla procedur składowanych. IF OBJECT_ID ('dbo.sprocName', 'P') NIE JEST NULL DROP PROCEDURE dbo.sprocName; GO
hanesjw
Nie wiem, czy to była najlepsza odpowiedź w 2009 r., Ale wydaje się, że jest w 2016 r. (Chociaż SQL Server 2016 wprowadza jeszcze lepszą opcję).
Eric J.
1
OBJECT_ID doc msdn.microsoft.com/en-us/library/ms190328.aspx - a ten zawiera wszystkie typy obiektów: msdn.microsoft.com/en-us/library/ms190324.aspx
Simon_Weaver
55

To najbardziej przenośny i najmniej uciążliwy sposób:

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

Edycja: To działa na SQL Server i nie wymaga dołączania do, sys.schemasaby uzyskać schemat widoku. Jest to mniej ważne, jeśli wszystko tak jest dbo, ale jeśli dobrze wykorzystujesz schematy, powinieneś o tym pamiętać.

Każdy RDBMS ma swój własny sposób sprawdzania metadanych, takich jak ten, ale w information_schemarzeczywistości jest to ANSI i myślę, że Oracle i najwyraźniej SQLite są jedynymi, które nie obsługują go w jakiś sposób.

Eric
źródło
3
Używanie sqlite: błąd SQL: brak takiej tabeli: INFORMATION_SCHEMA.VIEWS
@lutz: +1, z powodu braku wsparcia w SQLite.
Alix Axel
18
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )
Kaal
źródło
W przypadku Microsoft SQL Server jest to najbardziej przydatne, ponieważ IF EXISTS jest często używane podczas tworzenia skryptów zarządzania schematami. W skrypcie prawdopodobnie masz już CREATE ViEW [dbo]. [MyView], a powyższy jest najprostszym fragmentem do kopiowania i wklejania.
Jimmy Bosse
15

Dla ludzi, którzy sprawdzają istnienie, spadają View użyj tego

Od SQL Server 2016 CTP3możesz użyć nowych instrukcji DIE zamiast dużychIF owijarki

składnia

UPUŚĆ WIDOK [JEŚLI ISTNIEJE] [nazwa_schematu. ] nazwa_widoku [..., n] [; ]

Zapytanie:

DROP VIEW IF EXISTS view_name

Więcej informacji tutaj

P ரதீப்
źródło
1

jeśli jest to Oracle, użyjesz tabeli „all_views”.

To naprawdę zależy od twoich dbms.

user158017
źródło
1

Jeśli chcesz sprawdzić poprawność i spójność wszystkich istniejących widoków, możesz użyć następującego zapytania

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
źródło
1

W 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
źródło
0

Aby rozwinąć odpowiedź Kevina.

    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
źródło
0

Dostępność widoku możesz sprawdzić na różne sposoby

DLA SERWERA SQL

użyj 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

użyj sysobjects

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

użyj sys.views

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

użyj INFORMATION_SCHEMA.VIEWS

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

użyj OBJECT_ID

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

użyj 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
źródło