web-dev-qa-db-ja.com

ビューがデータベースに存在するかどうかを確認するにはどうすればよいですか?

特定のビューがデータベースに存在する場合に実行する必要があるSQLコードがあります。ビューが存在するかどうかを確認するにはどうすればよいですか?

編集:使用されているDBMSはMicrosoft SQL Serverです

120
Draco

SQLサーバー用

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

上記で指定された多くの方法が既にありますが、私のお気に入りの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
129
zzlalani

これは最も移植性が高く、邪魔にならない方法です。

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だけだと思います。

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

存在を確認する人がViewを削除するには、これを使用します

SQL Server 2016 CTP3から、大きなIFラッパーの代わりに新しいDIEステートメントを使用できます。

構文

ドロップビュー[存在する場合] [schema_name。 ] view_name [...、n] [; ]

クエリ:

DROP VIEW IF EXISTS view_name

詳細 こちら

14

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
1
UJS

既存のすべてのビューの有効性と一貫性を確認する場合は、次のクエリを使用できます

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に依存しています。

1
user158017

ケビンの答えを拡大する。

    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