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


127

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

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

回答:


161

SQLサーバー

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

7
あなたもおそらくsys.schemaここに参加したいでしょう。
エリック

エラー-無効なオブジェクト名 'sys.views'。私はマスターDBにクエリを実行していた
Steamの

これが(私がしたように)ビューのCREATEとALTERの間で決定することがわかった場合、これはVIEWでは機能しません。VIEW*をDROPしてから作成する必要があります。IF EXISTSは、ビューを削除するために引き続き正常に機能します。ありがとうございます。:) *行うときは、権限を忘れないでください。;)
FrostbiteXIII 2014年

これを試して。存在しない場合は、ビュー(単なるスタブ)を作成し、そのスタブを変更して更新を入れます。これにより、ビューをドロップする必要がなくなります。 structuredsight.com/2014/03/12/non-failing-scripts
kemiller2002

おそらく、チェックされているビューの名前を引用符で囲む必要がありますか?それ以外の場合、これは機能しません:)
リバースエンジニア

138

上で指定した方法はすでにたくさんありますが、私のお気に入りの1つがありません。

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

どこ nViewはビューの名前です

更新2017-03-25: @hanesjwが、2番目の引数としてではPなくVOBJECT_ID

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

4
私はこれが好きです。テーブルにも 'u'を使用できます。
Phillip Senn、2015年

2
または、ストアドプロシージャの場合は「P」。OBJECT_ID( 'dbo.sprocName'、 'P')がNULLでない場合DROP PROCEDURE dbo.sprocName; GO
hanesjw

これが2009年の最良の回答であったかどうかはわかりませんが、2016年のようです(SQL Server 2016ではさらに優れたオプションが導入されていますが)。
エリックJ.

1
OBJECT_ID doc msdn.microsoft.com/en-us/library/ms190328.aspx-これはすべてのオブジェクトタイプを提供します:msdn.microsoft.com/en-us/library/ms190324.aspx
Simon_Weaver '26

55

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

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だけです。


3
sqliteの使用:SQLエラー:そのようなテーブルはありません:INFORMATION_SCHEMA.VIEWS

@lutz:+ 1、SQLiteのサポートがないため。
Alix Axel

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

Microsoft SQL Serverの場合、スキーマ管理スクリプトを作成するときにIF EXISTSがよく使用されるため、これが最も役立ちます。スクリプトには、おそらく既にCREATE ViEW [dbo]。[MyView]があり、上記はコピーアンドペースト用のこの最も単純なスニペットです。
ジミーボス14

15

存在を確認して落とす人Viewはこちら

よりSQL Server 2016 CTP3新しい使用することができますDIEの 文の代わりに、大きなIFラッパを

構文

DROP VIEW [存在する場合] [schema_name。] view_name [...、n] [; ]

クエリ:

DROP VIEW IF EXISTS view_name

詳細はこちら


1

Oracleの場合は、「all_views」テーブルを使用します。

それは本当にあなたのdbmsに依存します。


1

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

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;

1

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

0

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

    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

ビューの可用性をさまざまな方法で確認できます

SQLサーバー

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

sysobjectsを使用する

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

sys.viewsを使用する

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

INFORMATION_SCHEMA.VIEWSを使用します

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

OBJECT_IDを使用

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

sys.sql_modulesを使用

IF EXISTS (
   SELECT 1
   FROM   sys.sql_modules
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
   PRINT 'View Exists'
END
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.