Tôi đang viết một thủ tục được lưu trữ trong SQL Server 2008. Tôi cần kiểm tra xem một bảng có tồn tại trong cơ sở dữ liệu hay không. Nếu nó không thì tôi cần phải tạo ra nó.
Làm thế nào để tôi làm điều này?
CREATE TABLE IF NOT EXISTS ...
Tôi đang viết một thủ tục được lưu trữ trong SQL Server 2008. Tôi cần kiểm tra xem một bảng có tồn tại trong cơ sở dữ liệu hay không. Nếu nó không thì tôi cần phải tạo ra nó.
Làm thế nào để tôi làm điều này?
CREATE TABLE IF NOT EXISTS ...
Câu trả lời:
Một cái gì đó như thế này
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'))
Để tương phản, tôi thích sử dụng hàm object_id như dưới đây. Nó dễ đọc hơn một chút và bạn không phải lo lắng về sys.objects so với sysobjects so với sys.all_objects so với sys.tables. Hình thức cơ bản:
IF object_id('MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Tất nhiên điều này sẽ hiển thị là "Hiện tại" nếu có bất kỳ đối tượng nào có tên đó. Nếu bạn muốn kiểm tra chỉ các bảng, bạn cần:
IF object_id('MyTable', 'U') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Nó cũng hoạt động cho các bảng tạm thời:
IF object_id('tempdb.dbo.#MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
Hãy để chúng tôi tạo một cơ sở dữ liệu mẫu với một bảng theo kịch bản dưới đây:
CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))
Cách tiếp cận 1: Sử dụng chế độ xem Information_SCHema.TABLES
Chúng ta có thể viết một truy vấn như dưới đây để kiểm tra xem Bảng tblTest có tồn tại trong cơ sở dữ liệu hiện tại không.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
Truy vấn trên kiểm tra sự tồn tại của bảng tblTest trên tất cả các lược đồ trong cơ sở dữ liệu hiện tại. Thay vì điều này nếu bạn muốn kiểm tra sự tồn tại của Bảng trong Lược đồ được chỉ định và Cơ sở dữ liệu được chỉ định thì chúng ta có thể viết truy vấn trên như dưới đây:
IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
Ưu điểm của phương pháp này: Các khung nhìn Information_SCHema có thể di động trên các hệ thống RDBMS khác nhau, do đó, việc chuyển sang RDBMS khác nhau không yêu cầu bất kỳ thay đổi nào.
Cách tiếp cận 2: Sử dụng hàm OBJECT_ID ()
Chúng ta có thể sử dụng OBJECT_ID()
chức năng như dưới đây để kiểm tra xem Bảng tblTest có tồn tại trong cơ sở dữ liệu hiện tại không.
IF OBJECT_ID(N'dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
Chỉ định các phần Tên cơ sở dữ liệu và Tên lược đồ cho Tên bảng là tùy chọn. Nhưng việc chỉ định Tên cơ sở dữ liệu và Tên lược đồ cung cấp một tùy chọn để kiểm tra sự tồn tại của bảng trong cơ sở dữ liệu đã chỉ định và trong một lược đồ đã chỉ định, thay vì kiểm tra trong cơ sở dữ liệu hiện tại trên tất cả các lược đồ. Truy vấn dưới đây cho thấy rằng mặc dù cơ sở dữ liệu hiện tại là cơ sở dữ liệu MASTER, chúng ta có thể kiểm tra sự tồn tại của tblTest
bảng trong dbo
lược đồ trong Test
cơ sở dữ liệu.
USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
Ưu điểm: Dễ nhớ. Một điểm đáng chú ý khác cần đề cập về OBJECT_ID()
chức năng là: nó cung cấp tùy chọn để kiểm tra sự tồn tại của Bảng tạm thời được tạo trong ngữ cảnh kết nối hiện tại. Tất cả các Cách tiếp cận khác kiểm tra sự tồn tại của Bảng tạm thời được tạo trên tất cả bối cảnh kết nối thay vì chỉ bối cảnh kết nối hiện tại. Dưới đây truy vấn cho thấy cách kiểm tra sự tồn tại của Bảng tạm thời bằng cách sử dụng OBJECT_ID()
chức năng:
CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
GO
Cách tiếp cận 3: Sử dụng sys.Objects Danh mục xem
Chúng ta có thể sử dụng Sys.Objects
khung nhìn danh mục để kiểm tra sự tồn tại của Bảng như dưới đây:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.tblTest') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Cách tiếp cận 4: Sử dụng sys.Tables Xem danh mục
Chúng ta có thể sử dụng Sys.Tables
khung nhìn danh mục để kiểm tra sự tồn tại của Bảng như dưới đây:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'tblTest' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Sys.Tables
Chế độ xem danh mục kế thừa các hàng từ Sys.Objects
chế độ xem danh mục, chế độ xem Sys.objects
danh mục được gọi là chế độ xem cơ sở trong đó sys.Tables
được gọi là chế độ xem dẫn xuất. Sys.Tables
sẽ chỉ trả về các hàng cho các đối tượng Bảng trong khi Sys.Object
xem ngoài việc trả lại các hàng cho các đối tượng bảng, nó sẽ trả về các hàng cho các đối tượng như: thủ tục được lưu trữ, các khung nhìn, v.v.
Cách tiếp cận 5: Tránh sử dụng sys.sysobjects Bảng hệ thống
Chúng ta nên tránh sử dụng sys.sysobjects
Bảng hệ thống trực tiếp, quyền truy cập trực tiếp vào Bảng sẽ bị phản đối trong một số phiên bản tương lai của Máy chủ Sql. Theo liên kết [Microsoft BOL] [1], Microsoft đang đề xuất sử dụng các chế độ xem danh mục sys.objects/sys.tables
thay vì sys.sysobjects
trực tiếp bảng hệ thống.
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
Tham khảo: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
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
Hãy thử câu lệnh sau để kiểm tra sự tồn tại của bảng trong cơ sở dữ liệu:
If not exists (select name from sysobjects where name = 'tablename')
Bạn có thể tạo bảng bên trong khối if.
sysobjects
là một khung nhìn tương thích chỉ tồn tại để tránh phá vỡ mã cũ hơn. Đề nghị của tôi sẽ được hệ thống quan điểm sử dụng Danh mục (ví dụ sys.objects
, sys.tables
) cho mã đó sẽ chỉ nhắm mục tiêu SQL Server instance 2008, và quan điểm schema thông tin (ví dụ information_schema.tables
) cho mã mà nhu cầu để được cầm tay. Bạn có thể tìm thêm thông tin về các chế độ xem khác nhau tại đây: Truy vấn Danh mục hệ thống máy chủ SQL
Nếu tôi không sai, điều này sẽ hoạt động:
if not exists (Select 1 from tableName)
create table ...