Veritabanında bir Görünüm olup olmadığını nasıl kontrol edebilirim?


Yanıtlar:


161

SQL SUNUCUSU İÇİN

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

7
Muhtemelen sys.schemaburaya da katılmak istersiniz .
— Eric

Hata - Geçersiz nesne adı 'sys.views'. Master DB'yi sorguluyordum
— Steam

Bunu bir görünüm için CREATE ve ALTER arasında karar vermek için bulduysanız (benim yaptığım gibi), bu GÖRÜNÜMLER için işe yaramaz - GÖRÜNÜMÜ DÜŞÜRMELİSİNİZ * ve sonra onu OLUŞTURMALISINIZ. IF EXISTS, GÖRÜŞÜNÜ BIRAKMAK için hala iyi çalışıyor, bu yüzden teşekkürler! :) * Yaptığınızda herhangi bir izni unutmayın. ;)
— FrostbiteXIII

Bunu dene. mevcut değilse görünümü oluşturun (sadece bir saplama) ve ardından güncellemelerinizi eklemek için o saplamayı değiştirin. Bu şekilde onu asla bırakmak zorunda kalmazsınız. structuredsight.com/2014/03/12/non-failing-scripts
— kemiller2002

Muhtemelen kontrol edilmekte olan görünümün adı alıntılara yazılmalıdır? Aksi takdirde bu asla işe yaramayacaktır :)
— Reversed Engineer

138

Yukarıda belirtilen birçok yol var ama favorilerimden biri eksik ..

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

Görüntünün nViewadı nerede

GÜNCELLEME 2017-03-25: @hanesjw , ikinci argüman Pyerine bir Mağaza Prosedürü kullanımını bırakmayı önerdiğindenVOBJECT_ID

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

4
Bunu beğendim. Tablolar için de 'u' kullanabilirsiniz.
— Phillip Senn

2
Veya saklı yordamlar için 'P'. OBJECT_ID ('dbo.sprocName', 'P') NULL DROP PROCEDURE DEĞİLSE dbo.sprocName; GO
— hanesjw

Bunun 2009'daki en iyi cevap olup olmadığını bilmiyorum, ancak 2016'da gibi görünüyor (SQL Server 2016 daha da iyi bir seçenek sunuyor).
— Eric J.


55

Bu, en taşınabilir, en az müdahaleci yoldur:

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

Düzenleme: Bu, SQL Server'da çalışır sys.schemasve görünümün şemasını almak için katılmanızı gerektirmez . Her şey böyleyse bu daha az önemlidir dbo, ancak şemaları iyi kullanıyorsanız, bunu aklınızda tutmalısınız.

Her RDBMS'nin bunun gibi meta verileri kontrol etmenin kendi küçük yolu vardır, ancak information_schemaaslında ANSI'dir ve sanırım Oracle ve görünüşe göre SQLite, onu bir şekilde desteklemeyenler.


3
Sqlite kullanma: SQL hatası: böyle bir tablo yok: INFORMATION_SCHEMA.VIEWS

@lutz: +1, SQLite desteği olmadığı için.
— Alix Axel

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

Microsoft SQL Server için bunu en kullanışlı buluyorum çünkü IF EXISTS genellikle şema yönetimi betikleri oluştururken kullanılır. Komut dosyasında muhtemelen CREATE VIEW [dbo] 'ya sahipsiniz. [MyView] ve yukarıdakiler, kopyalamak ve yapıştırmak için bu en basit snippet'tir.
— Jimmy Bosse

15

Varlığını kontrol eden insanlar Viewiçin bunu kullanın

Sizden büyük sarmalayıcılar yerine SQL Server 2016 CTP3yeni DIE ifadeleri kullanabilirsinizIF

sözdizimi

DROP GÖRÜNÜMÜ [VARSA] [şema_adı. ] görünüm_adı [..., n] [; ]

Sorgu :

DROP VIEW IF EXISTS view_name

Daha fazla bilgi burada


1

Oracle ise "all_views" tablosunu kullanırsınız.

Gerçekten veri tabanınıza bağlıdır.


1

Mevcut tüm görünümlerin geçerliliğini ve tutarlılığını kontrol etmek istiyorsanız aşağıdaki sorguyu kullanabilirsiniz.

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

SQL Sunucusunda,

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

Kevin'in cevabını genişletmek için.

    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

Görünümün kullanılabilirliğini çeşitli şekillerde kontrol edebilirsiniz

SQL SUNUCUSU İÇİN

Kullanım 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

sistem nesnelerini kullan

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

Kullanım 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 kullanın

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

Kullanım OBJECT_ID

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

sys.sql_modules kullanın

IF EXISTS (
   SELECT 1
   FROM   sys.sql_modules
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
   PRINT 'View Exists'
END
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.