Bagaimana saya bisa memeriksa jika Lihat ada di Database?

127

Saya memiliki beberapa kode SQL yang perlu dieksekusi jika ada tampilan tertentu dalam database. Bagaimana saya mengecek apakah View itu ada?

EDIT: DBMS yang digunakan adalah Microsoft SQL Server

Draco
sumber

Jawaban:

161

UNTUK SQL SERVER

IF EXISTS(select * FROM sys.views where name = '')
kemiller2002
sumber
7
Anda mungkin ingin bergabung di sys.schemasini juga.
Eric
Kesalahan -Nama objek tidak valid 'sys.views'. Saya meminta master DB
Steam
Jika Anda menemukan ini untuk memutuskan antara BUAT dan ALTER untuk tampilan (seperti yang saya lakukan), ini tidak berfungsi untuk PANDANGAN - Anda harus MEMBATALKAN PANDANGAN * dan kemudian BUAT itu. JIKA ADA masih berfungsi dengan baik untuk MENGHENTIKAN LIHAT, terima kasih! :) * Jangan lupa tentang izin apa pun saat Anda melakukannya. ;)
FrostbiteXIII
Coba ini. jika tidak ada, buat tampilan (hanya sebuah rintisan) dan kemudian ubah rintisan itu untuk memasukkan pembaruan Anda. Dengan begitu Anda tidak perlu menjatuhkannya. structuredsight.com/2014/03/12/non-failing-scripts
kemiller2002
Mungkin seseorang harus meletakkan nama tampilan yang diperiksa dalam tanda kutip? Kalau tidak, ini tidak akan pernah berhasil :)
Reversed Engineer
138

Sudah ada banyak cara yang ditentukan di atas tetapi salah satu favorit saya hilang ..

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

WHERE nViewadalah nama tampilan

UPDATE 2017-03-25: seperti yang disarankan oleh @hanesjw untuk membatalkan penggunaan Prosedur Toko Palih-alih Vsebagai argumen keduaOBJECT_ID

GO
IF OBJECT_ID( 'nProcedure', 'P' ) IS NOT NULL 
    DROP PROCEDURE dbo.sprocName; 
GO
zzlalani
sumber
4
Saya suka yang ini. Anda dapat menggunakan 'u' untuk tabel juga.
Phillip Senn
2
Atau 'P' untuk prosedur tersimpan. JIKA OBJECT_ID ('dbo.sprocName', 'P') BUKAN PROSEDUR DROP NULL dbo.sprocName; GO
hanesjw
Saya tidak tahu apakah ini adalah jawaban terbaik pada tahun 2009, tetapi tampaknya pada tahun 2016 (meskipun SQL Server 2016 memperkenalkan opsi yang lebih baik).
Eric J.
1
OBJECT_ID doc msdn.microsoft.com/en-us/library/ms190328.aspx - dan ini memberi Anda semua jenis objek: msdn.microsoft.com/en-us/library/ms190324.aspx
Simon_Weaver
55

Ini adalah cara yang paling portabel, paling tidak mengganggu:

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

Sunting: Ini berfungsi pada SQL Server, dan Anda tidak perlu bergabung sys.schemasuntuk mendapatkan skema tampilan. Ini kurang penting jika semuanya dbo, tetapi jika Anda memanfaatkan skema dengan baik, maka Anda harus mengingatnya.

Setiap RDBMS memiliki sedikit cara sendiri untuk memeriksa metadata seperti ini, tetapi information_schemasebenarnya ANSI, dan saya pikir Oracle dan tampaknya SQLite adalah satu-satunya yang tidak mendukungnya dalam beberapa cara.

Eric
sumber
3
Menggunakan sqlite: Kesalahan SQL: tidak ada tabel seperti: INFORMATION_SCHEMA.VIEWS
@ Lutz: +1, karena kurangnya dukungan pada SQLite.
Alix Axel
18
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )
Kaal
sumber
Untuk Microsoft SQL Server, saya menemukan ini yang paling berguna karena JIKA ADA sering digunakan ketika membuat skrip manajemen skema. Dalam skrip Anda mungkin sudah memiliki CREATE VIEW [dbo]. [MyView] dan yang di atas adalah cuplikan paling sederhana untuk disalin dan ditempel.
Jimmy Bosse
15

Untuk orang-orang yang memeriksa keberadaannya, Viewgunakan ini

Dari SQL Server 2016 CTP3Anda dapat menggunakan pernyataan DIE baru, bukan IFpembungkus besar

sintaksis

LIHAT DROP [JIKA ADA] [schema_name. ] view_name [..., n] [; ]

Pertanyaan:

DROP VIEW IF EXISTS view_name

Info lebih lanjut di sini

P ரதீப்
sumber
1

jika itu Oracle, Anda akan menggunakan tabel "all_views".

Itu benar-benar tergantung pada dbms Anda.

pengguna158017
sumber
1

Jika Anda ingin memeriksa validitas dan konsistensi semua tampilan yang ada, Anda dapat menggunakan kueri berikut

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;
Sriwantha Attanayake
sumber
1

DI 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
UJS
sumber
0

Untuk memperluas jawaban 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));
        }
    }
joe
sumber
0

Anda dapat memeriksa ketersediaan tampilan dengan berbagai cara

UNTUK SQL SERVER

gunakan 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

gunakan sysobjects

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

gunakan sys.views

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

gunakan INFORMATION_SCHEMA.VIEWS

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

gunakan OBJECT_ID

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

gunakan sys.sql_modules

IF EXISTS (
   SELECT 1
   FROM   sys.sql_modules
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
   PRINT 'View Exists'
END
Reza Jenabi
sumber