特定のビューがデータベースに存在する場合に実行する必要があるSQLコードがあります。ビューが存在するかどうかを確認するにはどうすればよいですか?
編集:使用されているDBMSはMicrosoft SQL Serverです
SQLサーバー用
IF EXISTS(select * FROM sys.views where name = '')
上記で指定された多くの方法が既にありますが、私のお気に入りの1つがありません。
GO
IF OBJECT_ID('nView', 'V') IS NOT NULL
DROP VIEW nView;
GO
WHERE nView
はビューの名前です
PDATE 2017-03-25: @hanesjwがストアプロシージャを削除することを示唆したように、OBJECT_ID
の2番目の引数としてP
の代わりにV
を使用します
GO
IF OBJECT_ID( 'nProcedure', 'P' ) IS NOT NULL
DROP PROCEDURE dbo.sprocName;
GO
これは最も移植性が高く、邪魔にならない方法です。
select
count(*)
from
INFORMATION_SCHEMA.VIEWS
where
table_name = 'MyView'
and table_schema = 'MySchema'
編集:これはSQL Serverで機能し、ビューのスキーマを取得するためにsys.schemas
に参加する必要はありません。すべてがdbo
である場合、これはそれほど重要ではありませんが、スキーマをうまく利用している場合は、そのことを覚えておく必要があります。
各RDBMSには、このようなメタデータを確認する独自の小さな方法がありますが、information_schema
は実際にはANSIであり、何らかの方法でそれをサポートしていないのはOracleとSQLiteだけだと思います。
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )
存在を確認する人がView
を削除するには、これを使用します
SQL Server 2016 CTP3
から、大きなIF
ラッパーの代わりに新しいDIEステートメントを使用できます。
構文
ドロップビュー[存在する場合] [schema_name。 ] view_name [...、n] [; ]
クエリ:
DROP VIEW IF EXISTS view_name
詳細 こちら
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
既存のすべてのビューの有効性と一貫性を確認する場合は、次のクエリを使用できます
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;
oracleの場合、「all_views」テーブルを使用します。
それは本当にあなたのdbmsに依存しています。
ケビンの答えを拡大する。
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));
}
}