Hoe kan ik controleren of een weergave bestaat in een database?

Ik heb wat SQL-code die moet worden uitgevoerd als een bepaalde weergave bestaat in een database. Hoe zou ik gaan om te controleren of de weergave bestaat?

EDIT: de gebruikte DBMS is Microsoft SQL Server


1, Autoriteit 100%

voor SQL Server

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

2, Autoriteit 90%

Er zijn al veel verschillende manieren die hierboven zijn gespecificeerd, maar een van mijn favoriet ontbreekt ..

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

Waar nViewis de naam van weergave

Update 2017-03-25: Zoals @hanesjw stelde voor om een ​​opslagprocedure te laten vallen Gebruik Pin plaats van Vals het tweede argument van OBJECT_ID

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

3, Autoriteit 34%

Dit is de meest draagbare, minst opdringerige manier:

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

EDIT: dit werkt werkt op SQL Server, en het vereist niet dat u deelneemt aan sys.schemasom het schema van de weergave te krijgen. Dit is minder belangrijk als alles dbois, maar als u goed gebruik maakt van Schema’s, moet u dat in gedachten houden.

Elke RDBMS heeft hun eigen kleine manier om metagegevens zoals deze te controleren, maar information_schemais eigenlijk ANSI, en ik denk dat orakel en blijkbaar SQLite de enigen zijn die het op een of andere manier niet ondersteunen.


4, Autoriteit 10%

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

5, Autoriteit 2%

U kunt de beschikbaarheid van de weergave op verschillende manieren controleren

voor SQL Server

Gebruik 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

Gebruik sysobjects

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

Gebruik sys.views

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

Gebruik informatie_schema.views

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

Gebruik object_id

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

Gebruik sys.sql_modules

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

6

Als het Oracle zou je de “all_views” te gebruiken tafel.

Het hangt af van uw DBMS.


7

Als u wilt de geldigheid en consistentie van alle bestaande standpunten kunt u gebruik maken van de volgende query

check

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;

8

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

9

Uit te breiden over het antwoord van Kevin’s.

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

Other episodes