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 nView
is de naam van weergave
Update 2017-03-25: Zoals @hanesjw stelde voor om een opslagprocedure te laten vallen Gebruik P
in plaats van V
als 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.schemas
om het schema van de weergave te krijgen. Dit is minder belangrijk als alles dbo
is, 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_schema
is 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));
}
}