2009-08-20 120 views

回答

127

對於SQL Server

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

您可能還想在這裏加入'sys.schema'。 – Eric 2009-08-20 13:07:03

+0

錯誤 - 無效的對象名稱'sys.views'。我正在查詢主數據庫 – Steam 2013-11-20 18:02:55

+0

如果您發現此操作在CREATE和ALTER之間進行視圖決定(如我所做的那樣),這對VIEWs不起作用 - 您必須刪除VIEW *然後創建它。 IF EXISTS仍然可以正常使用,因此謝謝! :) *當你這樣做時,不要忘記任何權限。 ;) – FrostbiteXIII 2014-05-21 10:40:52

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

使用sqlite:SQL錯誤:沒有這樣的表:INFORMATION_SCHEMA.VIEWS – 2009-08-20 12:59:24

+0

@lutz:+1,因爲缺乏對SQLite的支持。 – 2009-08-21 22:50:56

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],以上是複製和粘貼的最簡單片段。 – 2014-12-02 16:53:15

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

儘管有上述規定已經很多方面現有的觀點一致,但一個不見了..

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

WHERE nView在視

名稱

UPDATE 2017年3月25日:作爲@hanesjw建議用於刪除存儲過程使用P代替V作爲OBJECT_ID

第二個參數
GO 
IF OBJECT_ID('nProcedure', 'P') IS NOT NULL 
    DROP PROCEDURE dbo.sprocName; 
GO 
+11

它也接受模式。 'object_id(N'dbo.View',N'v)' – 2013-12-12 03:33:58

+4

我喜歡這個。你也可以使用'u'作爲表格。 – 2015-10-10 22:47:54

+2

或'P'存儲過程。 IF OBJECT_ID('dbo.sprocName','P')IS NOT NULL DROP PROCEDURE dbo.sprocName; GO – hanesjw 2016-01-29 18:45:23

12

對於檢查是否存在丟失的人View使用此

SQL Server 2016 CTP3您可以使用新的DIE報表,而不是大IF包裝

語法

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

查詢:

DROP VIEW IF EXISTS view_name 

更多信息here

0

在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 
相關問題