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.