ฉันจะตรวจสอบได้อย่างไรว่ามีมุมมองอยู่ในฐานข้อมูลหรือไม่


127

ฉันมีโค้ด SQL ที่ต้องดำเนินการหากมีมุมมองบางอย่างอยู่ในฐานข้อมูล ฉันจะตรวจสอบได้อย่างไรว่ามี View อยู่หรือไม่

แก้ไข: DBMS ที่ใช้คือ Microsoft SQL Server

คำตอบ:


161

สำหรับ SQL SERVER

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

7
คุณอาจต้องการเข้าร่วมsys.schemaที่นี่เช่นกัน
Eric

ข้อผิดพลาด - ชื่อวัตถุไม่ถูกต้อง 'sys.views' ฉันกำลังสอบถามฐานข้อมูลหลัก
Steam

หากคุณพบสิ่งนี้เพื่อตัดสินใจระหว่าง CREATE และ ALTER สำหรับมุมมอง (เหมือนที่ฉันทำ) สิ่งนี้ใช้ไม่ได้กับ VIEW - คุณต้องวาง VIEW * แล้วจึงสร้าง IF EXISTS ยังคงใช้งานได้ดีสำหรับการลดมุมมองดังนั้นขอบคุณมาก! :) * อย่าลืมเกี่ยวกับสิทธิ์ใด ๆ เมื่อคุณทำ ;)
FrostbiteXIII

ลองทำตามนี้ หากไม่มีให้สร้างมุมมอง (เป็นเพียงส่วนที่ขาด) จากนั้นแก้ไขต้นขั้วนั้นเพื่อใส่การอัปเดตของคุณด้วยวิธีนี้คุณจะไม่ต้องทิ้งมัน Structuredsight.com/2014/03/12/non-failing-scripts
kemiller2002

สันนิษฐานว่าควรใส่ชื่อของมุมมองที่ตรวจสอบไว้ในเครื่องหมายคำพูด? มิฉะนั้นจะไม่ทำงาน :)
Reversed Engineer

138

มีหลายวิธีที่ระบุไว้ข้างต้นแล้ว แต่หนึ่งในรายการโปรดของฉันหายไป ..

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

WHERE nViewคือชื่อของมุมมอง

อัปเดต 2017-03-25:ตามที่ @hanesjw แนะนำให้เลิกใช้ Store Procedure Pแทนการใช้Vอาร์กิวเมนต์ที่สองของOBJECT_ID

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

4
ฉันชอบอันนี้ คุณสามารถใช้ 'u' สำหรับตารางได้เช่นกัน
Phillip Senn

2
หรือ 'P' สำหรับขั้นตอนการจัดเก็บ ถ้า OBJECT_ID ('dbo.sprocName', 'P') ไม่ใช่ NULL DROP PROCEDURE dbo.sprocName; GO
hanesjw

ฉันไม่รู้ว่านี่เป็นคำตอบที่ดีที่สุดในปี 2009 หรือไม่ แต่ดูเหมือนว่าจะเป็นในปี 2559 (แม้ว่า SQL Server 2016 จะแนะนำตัวเลือกที่ดีกว่าก็ตาม)
Eric J.

1
OBJECT_ID doc msdn.microsoft.com/en-us/library/ms190328.aspx - และหนึ่งนี้จะช่วยให้คุณทุกประเภทวัตถุ: msdn.microsoft.com/en-us/library/ms190324.aspx
Simon_Weaver

55

นี่เป็นวิธีที่พกพาง่ายที่สุดและล่วงล้ำน้อยที่สุด:

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

แก้ไข: สิ่งนี้ใช้ได้กับ SQL Server และไม่ต้องการให้คุณเข้าร่วมsys.schemasเพื่อรับสคีมาของมุมมอง สิ่งนี้มีความสำคัญน้อยกว่าหากทุกอย่างมีdboแต่ถ้าคุณใช้ประโยชน์จากสคีมาให้ดีคุณควรจำไว้

RDBMS แต่ละตัวมีวิธีตรวจสอบข้อมูลเมตาแบบนี้เล็กน้อย แต่information_schemaจริงๆแล้วเป็น ANSI และฉันคิดว่า Oracle และ SQLite เป็นเพียงคนเดียวที่ไม่รองรับในบางรูปแบบ


3
การใช้ sqlite: ข้อผิดพลาด SQL: ไม่มีตารางดังกล่าว: INFORMATION_SCHEMA.VIEWS

@lutz: +1 เนื่องจากขาดการสนับสนุน SQLite
Alix Axel

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

สำหรับ Microsoft SQL Server ฉันพบว่าสิ่งนี้มีประโยชน์ที่สุดเนื่องจาก IF EXISTS มักใช้เมื่อสร้างสคริปต์การจัดการสคีมา ในสคริปต์คุณอาจมี CREATE ViEW [dbo] อยู่แล้ว [MyView] และข้างต้นเป็นตัวอย่างข้อมูลที่ง่ายที่สุดสำหรับการคัดลอกและวาง
Jimmy Bosse

15

สำหรับคนที่ตรวจสอบการมีอยู่ให้Viewใช้สิ่งนี้

จากSQL Server 2016 CTP3คุณสามารถใช้ คำสั่งDIEใหม่แทน bigIFห่อ

วากยสัมพันธ์

DROP VIEW [IF EXISTS] [schema_name. ] view_name [... , n] [; ]

คำถาม:

DROP VIEW IF EXISTS view_name

ข้อมูลเพิ่มเติมที่นี่


1

ถ้าเป็น Oracle คุณจะใช้ตาราง "all_views"

มันขึ้นอยู่กับ dbms ของคุณจริงๆ


1

หากคุณต้องการตรวจสอบความถูกต้องและความสอดคล้องของมุมมองที่มีอยู่ทั้งหมดคุณสามารถใช้แบบสอบถามต่อไปนี้

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 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

เพื่อขยายคำตอบของเควิน

    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

คุณสามารถตรวจสอบความพร้อมของมุมมองได้หลายวิธี

สำหรับ SQL SERVER

ใช้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

ใช้sysobjects

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

ใช้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

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

ใช้OBJECT_ID

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

ใช้sys.sql_modules

IF EXISTS (
   SELECT 1
   FROM   sys.sql_modules
   WHERE  OBJECT_ID = OBJECT_ID('[schemaName].[ViewName]')
)
BEGIN
   PRINT 'View Exists'
END
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.