Làm cách nào để kiểm tra xem Chế độ xem có tồn tại trong Cơ sở dữ liệu không?


127

Tôi có một số mã SQL cần được thực thi nếu một Chế độ xem nào đó tồn tại trong cơ sở dữ liệu. Làm cách nào để kiểm tra xem Chế độ xem có tồn tại không?

EDIT: DBMS đang được sử dụng là Microsoft SQL Server

Câu trả lời:


161

CHO SQL SERVER

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

7
Bạn có thể muốn tham gia ở sys.schemađây, là tốt.
Eric

Lỗi -Invalid tên đối tượng 'sys.view'. Tôi đã truy vấn chủ DB
Steam

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

Thử cái này. nếu nó không tồn tại, hãy tạo chế độ xem (chỉ là sơ khai) và sau đó thay đổi sơ khai đó để đưa các cập nhật của bạn vào. Bằng cách đó, bạn không bao giờ phải bỏ nó. structuredsight.com/2014/03/12/non-failing-scripts
kemiller2002

Có lẽ người ta nên đặt tên của chế độ xem đang được kiểm tra trong dấu ngoặc kép? Nếu không thì điều này sẽ không bao giờ hoạt động :)
Kỹ sư đảo ngược

138

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

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

WHERE nViewlà tên của quan điểm

CẬP NHẬT 2017 / 03-25: như @hanesjw đã đề xuất bỏ sử dụng Quy trình lưu trữ Pthay vì Vlàm đối số thứ hai củaOBJECT_ID

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

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

2
Hoặc 'P' cho các thủ tục được lưu trữ. NẾU OBRI_ID ('dbo.sprocName', 'P') KHÔNG PHẢI LÀ QUY TRÌNH NULL DROP dbo.sprocName; GO
hanesjw

Tôi không biết liệu đây có phải là câu trả lời hay nhất trong năm 2009 hay không, nhưng dường như là vào năm 2016 (mặc dù SQL Server 2016 đang giới thiệu một tùy chọn thậm chí tốt hơn).
Eric J.

1
Object_id doc msdn.microsoft.com/en-us/library/ms190328.aspx - và điều này mang đến cho bạn tất cả các loại đối tượng: msdn.microsoft.com/en-us/library/ms190324.aspx
Simon_Weaver

55

Đây là cách di động nhất, ít xâm nhập nhất:

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

Chỉnh sửa: Điều này không hoạt động trên SQL Server và nó không yêu cầu bạn tham gia sys.schemasđể có được lược đồ của chế độ xem. Điều này ít quan trọng hơn nếu mọi thứ đều như vậy 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 nhỏ như thế này, nhưng information_schemathực ra là ANSI và tôi nghĩ rằng Oracle và rõ ràng SQLite là những người duy nhất không hỗ trợ nó theo cách nào đó.


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

@lutz: +1, vì thiếu hỗ trợ trên SQLite.
Alix Axel

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

Đố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 tập lệnh quản lý lược đồ. Trong tập lệnh có thể bạn đã có CREATE ViEW [dbo]. [MyView] và ở trên là đoạn mã đơn giản nhất này để sao chép và dán.
Jimmy Bosse

15

Đối với những người kiểm tra sự tồn tại để Viewsử dụng

Từ SQL Server 2016 CTP3bạn có thể sử dụng các câu lệnh DIE mới thay vì các IFhàm bao lớn

cú pháp

XEM DROP [NẾU EXISTS] [giản đồ tên. ] view_name [..., n] [; ]

Truy vấn :

DROP VIEW IF EXISTS view_name

Thêm thông tin ở đây


1

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

Nó thực sự phụ thuộc vào dbms của bạ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 chế độ xem hiện tại, bạn có thể sử dụng truy vấn sau

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

Ở máy chủ SQL,

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

Để 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));
        }
    }

0

Bạn có thể kiểm tra tính khả dụng của chế độ xem theo nhiều cách khác nhau

CHO SQL SERVER

sử dụng 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

sử dụng sysobjects

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

sử dụng sys.view

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

sử dụng THÔNG TIN_SCHema.VIEWS

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

sử dụng OBarget_ID

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

sử dụng sys.sql_modules

IF EXISTS (
   SELECT 1
   FROM   sys.sql_modules
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
   PRINT 'View Exists'
END
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.