2009-08-20 47 views

Trả lời

127

CHO SQL SERVER

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

Có thể bạn cũng muốn tham gia vào 'sys.schema' tại đây. – Eric

+0

Lỗi Tên đối tượng không hợp lệ 'sys.views'. Tôi đã truy vấn chủ DB – Steam

+0

Nếu bạn thấy điều này để quyết định giữa một TẠO và ALTER cho một lượt xem (như tôi đã làm), điều này không hoạt động cho VIEWs - bạn phải DROP VIEW * và sau đó TẠO nó. IF EXISTS vẫn hoạt động tốt cho DROPing VIEW tho, vì vậy cảm ơn! :) * Đừng quên bất kỳ quyền nào khi bạn làm. ;) – FrostbiteXIII

45

Đây là di động nhất, cách xâm nhập tối thiểu:

select 
    count(*) 
from 
    INFORMATION_SCHEMA.VIEWS 
where 
    table_name = 'MyView' 
    and table_schema = 'MySchema' 

Chỉnh sửa: Điều này không làm việc trên SQL Server và không yêu cầu bạn tham gia sys.schemas để nhận giản đồ của chế độ xem. Điều này ít quan trọng hơn nếu mọi thứ là dbo, nhưng nếu bạn đang sử dụng tốt các lược đồ, thì bạn nên ghi nhớ điều đó.

Mỗi RDBMS có cách kiểm tra siêu dữ liệu riêng của mình như thế này, nhưng information_schema thực sự là ANSI, và tôi nghĩ Oracle và dường như SQLite là những cái duy nhất không hỗ trợ nó theo một cách nào đó.

+3

Sử dụng sqlite: Lỗi SQL: không có bảng như vậy: INFORMATION_SCHEMA.VIEWS –

+0

@lutz: +1, vì thiếu hỗ trợ về SQLite. –

1

nếu đó là Oracle, bạn sẽ sử dụng bảng "all_views".

Nó thực sự phụ thuộc vào dbms của bạn.

0

Để mở rộng câu trả lời của Kevin.

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

Đối với Microsoft SQL Server, tôi thấy điều này hữu ích nhất vì IF EXISTS thường được sử dụng khi tạo các kịch bản quản lý lược đồ. Trong kịch bản bạn có thể đã có CREATE ViEW [dbo]. [MyView] và ở trên là đoạn mã đơn giản nhất để sao chép và dán. –

1

Nếu bạn muốn kiểm tra tính hợp lệ và tính nhất quán của tất cả các quan điểm hiện tại bạn có thể sử dụng các truy vấn sau đây

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

Mặc dù đã có nhiều cách đã nêu ở trên nhưng một trong những yêu thích của tôi bị thiếu ..

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

ĐÂU nView là tên của view

CẬP NHẬT 2017/03/25: như @hanesjw gợi ý để thả một Store Procedure sử dụng P thay vì V như là đối số thứ hai của OBJECT_ID

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

Nó cũng chấp nhận lược đồ. 'object_id (N'dbo.View ', N'v)' –

+4

Tôi thích cái này. Bạn cũng có thể sử dụng 'u' cho các bảng. –

+2

Hoặc 'P' để lưu các thủ tục. NẾU OBJECT_ID ('dbo.sprocName', 'P') KHÔNG PHẢI là NULL DROP PROCEDURE dbo.sprocName; GO – hanesjw

12

Đối với những người kiểm tra sự tồn tại để thả View, hãy sử dụng số điện thoại

này

Từ SQL Server 2016 CTP3 bạn có thể sử dụng mới DIE báo cáo thay vì lớn IF wrappers

cú pháp

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

Query:

DROP VIEW IF EXISTS view_name 

Thông tin thêm here

0

TRÊN 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 
Các vấn đề liên quan