2009-08-20 8 views

答えて

127

ある

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

あなたはおそらく同様に、ここでsys.schema' 'に参加したいです。 – Eric

+0

エラー - オブジェクト名 'sys.views'が無効です。私はマスターDBに照会していました – Steam

+0

これがCREATEとALTERの間で(私が行ったように)決定することがわかった場合、これはVIEWでは機能しません - VIEW *をDROPしてからCREATEする必要があります。 IF EXISTSはまだVIEW thoを落とすために正常に動作しますので、ありがとう! :) *権限を忘れることはありません。 ;) – FrostbiteXIII

45

これは、ほとんどのポータブル、少なくとも侵入的な方法である:

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

を働くことはありません。 –

+0

@lutz:+1、SQLiteの上のサポートの欠如のためにそうしないと、これはsqliteのを使用して:) –

1

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

これは実際にあなたのdbmsに依存します。

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)); 
     } 
    } 
17
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]')) 
+0

Microsoft SQL Serverの場合、これはスキーマ管理スクリプトの作成時にIF EXISTSがよく使用されるため、最も便利です。このスクリプトでは、すでにCREATE ViEW [dbo]。[MyView]を持っている可能性があります。上記のコピーと貼り付けのための最も簡単なスニペットです。 –

1

あなたはすべての既存のビューの妥当性と一貫性を確認したい場合は、多くの上、指定の方法が、私のお気に入りの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 '[email protected] 
begin try 
exec (@cmd) 
end try 
begin catch 
print 'Error: The view '[email protected]+' is corrupted .' 
end catch 
FETCH NEXT FROM check_cursor 
INTO @viewName 
END 
CLOSE check_cursor; 
DEALLOCATE check_cursor; 
110

を使用することができます不足している..

nViewビュー

UPDATE 2017年3月25日の名前です

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

:@hanesjwはOBJECT_ID

の2番目の引数としてPの代わりVを使用するストアプロシージャを削除するために提案されているよう
GO 
IF OBJECT_ID('nProcedure', 'P') IS NOT NULL 
    DROP PROCEDURE dbo.sprocName; 
GO 
+11

また、スキーマを受け入れます。 'object_id(N'dbo.View '、N'v)' –

+4

私はこれを好きです。テーブルにも 'u'を使用できます。 –

+2

ストアドプロシージャの場合は 'P'。 OBJECT_ID( 'dbo.sprocName'、 'P')は DROP PROCEDURE dbo.sprocName NULLされていない場合は、 GO – hanesjw

12

落下の有無を確認する人には、Viewを使用してください。

から

あなたが新しいDIE文の代わりに、大きなIFラッパー

構文を使用することができます

DROP VIEW [ IF EXISTS ] [ schema_name . ] view_name [ ...,n ] [ ; ]

問合せ:

DROP VIEW IF EXISTS view_name 

詳細情報SQL Serverでのhere

0

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 
関連する問題