ฉันกำลังเขียนขั้นตอนที่เก็บไว้ใน SQL Server 2008 ฉันต้องการตรวจสอบว่ามีตารางอยู่ในฐานข้อมูลหรือไม่ ถ้าไม่เป็นเช่นนั้นฉันต้องสร้างมันขึ้นมา
ฉันต้องทำอย่างไร
CREATE TABLE IF NOT EXISTS ...
ฉันกำลังเขียนขั้นตอนที่เก็บไว้ใน SQL Server 2008 ฉันต้องการตรวจสอบว่ามีตารางอยู่ในฐานข้อมูลหรือไม่ ถ้าไม่เป็นเช่นนั้นฉันต้องสร้างมันขึ้นมา
ฉันต้องทำอย่างไร
CREATE TABLE IF NOT EXISTS ...
คำตอบ:
อะไรทำนองนี้
IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[YourTable](
....
....
....
)
END
if (not exists (select object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
เพื่อความคมชัดฉันชอบใช้ฟังก์ชัน object_id ดังที่แสดงด้านล่าง อ่านง่ายขึ้นเล็กน้อยและคุณไม่ต้องกังวลเกี่ยวกับ sys.objects vs. sysobjects vs. sys.all_objects vs. sys.tables รูปแบบพื้นฐาน:
IF object_id('MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
แน่นอนสิ่งนี้จะแสดงเป็น "ปัจจุบัน" หากมีวัตถุใด ๆ ที่มีชื่อนั้นอยู่ หากคุณต้องการตรวจสอบเฉพาะตารางคุณต้อง:
IF object_id('MyTable', 'U') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
มันใช้ได้กับตารางชั่วคราวเช่นกัน:
IF object_id('tempdb.dbo.#MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
ให้เราสร้างฐานข้อมูลตัวอย่างด้วยตารางตามสคริปต์ด้านล่าง:
CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))
แนวทางที่ 1: การใช้มุมมอง INFORMATION_SCHEMA.TABLES
เราสามารถเขียนแบบสอบถามดังต่อไปนี้เพื่อตรวจสอบว่ามีตาราง tblTest อยู่ในฐานข้อมูลปัจจุบันหรือไม่
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
แบบสอบถามข้างต้นตรวจสอบการมีอยู่ของตาราง tblTest ในสกีมาทั้งหมดในฐานข้อมูลปัจจุบัน แทนที่จะเป็นเช่นนี้หากคุณต้องการตรวจสอบการมีอยู่ของตารางใน Schema ที่ระบุและฐานข้อมูลที่ระบุเราสามารถเขียนแบบสอบถามด้านบนได้ดังนี้:
IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
ข้อดีของวิธีนี้: มุมมอง INFORMATION_SCHEMA สามารถพกพาได้ในระบบ RDBMS ที่แตกต่างกันดังนั้นการพอร์ตไปยัง RDBMS ที่แตกต่างกันจึงไม่จำเป็นต้องมีการเปลี่ยนแปลงใด ๆ
แนวทางที่ 2: การใช้ฟังก์ชัน OBJECT_ID ()
เราสามารถใช้OBJECT_ID()
ฟังก์ชันดังต่อไปนี้เพื่อตรวจสอบว่ามีตาราง tblTest อยู่ในฐานข้อมูลปัจจุบันหรือไม่
IF OBJECT_ID(N'dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
การระบุชื่อฐานข้อมูลและส่วนชื่อสคีมาสำหรับชื่อตารางเป็นทางเลือก แต่การระบุชื่อฐานข้อมูลและชื่อสคีมามีตัวเลือกในการตรวจสอบการมีอยู่ของตารางในฐานข้อมูลที่ระบุและภายในสคีมาที่ระบุแทนที่จะตรวจสอบในฐานข้อมูลปัจจุบันในสคีมาทั้งหมด แบบสอบถามด้านล่างแสดงให้เห็นว่าแม้ว่าฐานข้อมูลปัจจุบันจะเป็นฐานข้อมูล MASTER แต่เราสามารถตรวจสอบการมีอยู่ของtblTest
ตารางในdbo
สคีมาในTest
ฐานข้อมูลได้
USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
จุดเด่น: จำง่าย. อีกหนึ่งประเด็นที่น่าสังเกตเกี่ยวกับOBJECT_ID()
ฟังก์ชันคือ: มีตัวเลือกในการตรวจสอบการมีอยู่ของตารางชั่วคราวซึ่งสร้างขึ้นในบริบทการเชื่อมต่อปัจจุบัน แนวทางอื่น ๆ ทั้งหมดตรวจสอบการมีอยู่ของตารางชั่วคราวที่สร้างขึ้นในบริบทการเชื่อมต่อทั้งหมดแทนที่จะเป็นเพียงบริบทการเชื่อมต่อปัจจุบัน แบบสอบถามด้านล่างแสดงวิธีตรวจสอบการมีอยู่ของตารางชั่วคราวโดยใช้OBJECT_ID()
ฟังก์ชัน:
CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
GO
แนวทางที่ 3: การใช้ sys.Objects Catalog View
เราสามารถใช้Sys.Objects
มุมมองแค็ตตาล็อกเพื่อตรวจสอบการมีอยู่ของตารางดังที่แสดงด้านล่าง:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.tblTest') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
แนวทางที่ 4: การใช้ sys ตารางมุมมองแค็ตตาล็อก
เราสามารถใช้Sys.Tables
มุมมองแค็ตตาล็อกเพื่อตรวจสอบการมีอยู่ของตารางดังที่แสดงด้านล่าง:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'tblTest' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Sys.Tables
มุมมองแค็ตตาล็อกสืบทอดแถวจากSys.Objects
มุมมองแค็ตตาล็อกมุมมองSys.objects
แค็ตตาล็อกเรียกว่ามุมมองฐานโดยที่sys.Tables
เรียกว่ามุมมองที่ได้รับ Sys.Tables
จะส่งคืนแถวสำหรับวัตถุ Table เท่านั้นในขณะที่Sys.Object
มุมมองนอกเหนือจากการส่งคืนแถวสำหรับวัตถุตารางจะส่งคืนแถวสำหรับวัตถุเช่น: ขั้นตอนการจัดเก็บมุมมอง ฯลฯ
แนวทางที่ 5: หลีกเลี่ยงการใช้ตารางระบบ sys.sysobjects
เราควรหลีกเลี่ยงการใช้sys.sysobjects
System Table โดยตรงการเข้าถึงโดยตรงจะถูกเลิกใช้ใน Sql Server บางเวอร์ชันในอนาคต ตามลิงก์ [Microsoft BOL] [1] Microsoft ขอแนะนำให้ใช้มุมมองแค็ตตาล็อกsys.objects/sys.tables
แทนsys.sysobjects
ตารางระบบโดยตรง
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
อ้างอิง: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
แก้ไข
คุณสามารถดูsys.tablesเพื่อตรวจสอบตารางที่ต้องการได้:
IF NOT EXISTS (SELECT * FROM sys.tables
WHERE name = N'YourTable' AND type = 'U')
BEGIN
CREATE TABLE [SchemaName].[YourTable](
....
....
....
)
END
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'd020915'))
BEGIN
declare @result int
set @result=1
select @result as result
END
Declare @Username varchar(20)
Set @Username = 'Mike'
if not exists
(Select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'tblEmp')
Begin
Create table tblEmp (ID int primary key, Name varchar(50))
Print (@Username + ' Table created successfully')
End
Else
Begin
Print (@Username + ' : this Table Already exists in the database')
End
ลองใช้คำสั่งต่อไปนี้เพื่อตรวจสอบการมีอยู่ของตารางในฐานข้อมูล:
If not exists (select name from sysobjects where name = 'tablename')
คุณสามารถสร้างตารางภายในบล็อก if
sysobjects
เป็นมุมมองความเข้ากันได้ที่มีอยู่เพื่อหลีกเลี่ยงการทำลายโค้ดรุ่นเก่า ข้อเสนอแนะของฉันจะใช้มุมมองระบบแคตตาล็อก (เช่นsys.objects
, sys.tables
) สำหรับรหัสที่จะกำหนดเป้าหมาย 2008 อินสแตนซ์ของ SQL Server และมุมมองสคีข้อมูล (เช่นinformation_schema.tables
) สำหรับรหัสที่ความต้องการที่จะพกพา คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับมุมมองต่างๆได้ที่นี่: การสืบค้น SQL Server System Catalog
ถ้าฉันไม่ผิดสิ่งนี้ควรได้ผล:
if not exists (Select 1 from tableName)
create table ...