ฉันมีโค้ด SQL ที่ต้องดำเนินการหากมีมุมมองบางอย่างอยู่ในฐานข้อมูล ฉันจะตรวจสอบได้อย่างไรว่ามี View อยู่หรือไม่
แก้ไข: DBMS ที่ใช้คือ Microsoft SQL Server
ฉันมีโค้ด SQL ที่ต้องดำเนินการหากมีมุมมองบางอย่างอยู่ในฐานข้อมูล ฉันจะตรวจสอบได้อย่างไรว่ามี View อยู่หรือไม่
แก้ไข: DBMS ที่ใช้คือ Microsoft SQL Server
คำตอบ:
สำหรับ SQL SERVER
IF EXISTS(select * FROM sys.views where name = '')
มีหลายวิธีที่ระบุไว้ข้างต้นแล้ว แต่หนึ่งในรายการโปรดของฉันหายไป ..
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
นี่เป็นวิธีที่พกพาง่ายที่สุดและล่วงล้ำน้อยที่สุด:
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 เป็นเพียงคนเดียวที่ไม่รองรับในบางรูปแบบ
if exists (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') )
สำหรับคนที่ตรวจสอบการมีอยู่ให้View
ใช้สิ่งนี้
จากSQL Server 2016 CTP3
คุณสามารถใช้ คำสั่งDIEใหม่แทน bigIF
ห่อ
วากยสัมพันธ์
DROP VIEW [IF EXISTS] [schema_name. ] view_name [... , n] [; ]
คำถาม:
DROP VIEW IF EXISTS view_name
ข้อมูลเพิ่มเติมที่นี่
ถ้าเป็น Oracle คุณจะใช้ตาราง "all_views"
มันขึ้นอยู่กับ dbms ของคุณจริงๆ
หากคุณต้องการตรวจสอบความถูกต้องและความสอดคล้องของมุมมองที่มีอยู่ทั้งหมดคุณสามารถใช้แบบสอบถามต่อไปนี้
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;
ใน 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
เพื่อขยายคำตอบของเควิน
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));
}
}
คุณสามารถตรวจสอบความพร้อมของมุมมองได้หลายวิธี
สำหรับ 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
sys.schema
ที่นี่เช่นกัน