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

Jawaban:


161

UNTUK SQL SERVER

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

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

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.


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.


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]') )

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


1

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

Itu benar-benar tergantung pada dbms Anda.


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;

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.