2012-01-15 40 views
113

Tôi muốn viết truy vấn cho MS SQL Server để thêm cột vào bảng. Nhưng tôi không muốn hiển thị lỗi, khi tôi chạy/thực thi truy vấn sau.Thêm cột vào bảng, nếu nó chưa tồn tại

Tôi đang sử dụng loại này truy vấn để thêm một bảng ...

IF EXISTS (
     SELECT * 
     FROM sys.objects 
     WHERE OBJECT_ID = OBJECT_ID(N'[dbo].[Person]') 
       AND TYPE IN (N'U') 
    ) 

Nhưng tôi không biết làm thế nào để viết truy vấn này cho một cột.

+0

có thể trùng lặp của [Cách kiểm tra xem cột có exis không ts trong bảng SQL Server] (http://stackoverflow.com/questions/133031/how-to-check-if-column-exists-in-sql-server-table) –

+0

Bạn nên sử dụng 'sys.tables' thay vì "sys.objects'" chung "- sau đó bạn không phải chỉ định kiểu rõ ràng (nó rõ ràng từ' sys.tables' đã ....) –

+0

COL_LENGTH Thay thế chỉ hoạt động từ SQL-Server 2008, nhưng nó công trinh. –

Trả lời

132

Bạn có thể sử dụng cấu trúc tương tự bằng cách sử dụng bảng sys.columns io sys.objects.

IF EXISTS (
    SELECT * 
    FROM sys.columns 
    WHERE object_id = OBJECT_ID(N'[dbo].[Person]') 
     AND name = 'ColumnName' 
) 
+37

Lưu ý rằng trong trường hợp này bạn muốn sử dụng IF NOT EXISTS trong mã thực của bạn. – Nat

+1

sẽ làm việc này trong MS SQL 2005? – guiomie

+2

Đối với truy vấn được tối ưu hóa, bạn có thể sử dụng hàng đầu 1 với câu lệnh chọn –

28

Một giải pháp thay thế khác. Tôi thích cách tiếp cận này bởi vì nó ít viết nhưng cả hai đều hoàn thành cùng một điều.

IF COLUMNPROPERTY(OBJECT_ID('dbo.Person'), 'ColumnName', 'ColumnId') IS NULL 
BEGIN 
    ALTER TABLE Person 
    ADD ColumnName VARCHAR(MAX) NOT NULL 
END 

Tôi cũng nhận thấy bạn đang tìm kiếm nơi bảng không tồn tại được rõ ràng chỉ này

if COLUMNPROPERTY(OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null 
+9

[Hoặc để đánh máy ít hơn] (http://stackoverflow.com/a/5369176/73226) –

+2

Tôi thích nó. Tôi nghĩ rằng phần hay nhất về việc đăng bài ở đây là tìm kiếm những viên đá quý như thế này. – JStead

45
IF COL_LENGTH('table_name', 'column_name') IS NULL 
BEGIN 
    ALTER TABLE table_name 
    ADD [column_name] INT 
END 
+1

Tôi đã thử làm điều này nhưng nó trả về một lỗi mà nói rằng hàm COL_LENGTH không tồn tại. – ThEpRoGrAmMiNgNoOb

+0

Yêu cầu SQL Server 2008+ – Rob

+0

Ngoài ra nhỏ - không nên sử dụng dấu ngoặc vuông trong tên cột, vì 'COL_LENGTH ('table_name', '[column_name]')' luôn trả về null trong SQL Server 2016 ('COL_LENGTH ('[ table_name] ',' column_name ') hoạt động như mong đợi'). –

3

/* Để kiểm tra sự tồn tại của cột trong bảng */

IF COL_LENGTH('TABLE_NAME','COLUMN_NAME') IS NULL 
BEGIN 
ALTER TABLE .... /*COLUMN DOES NOT EXIST OR CALLER DOES NOT HAVE PERMISSION TO VIEW THE OBJECT*/ 
END 
0
IF NOT EXISTS (SELECT 1 FROM SYS.COLUMNS WHERE 
OBJECT_ID = OBJECT_ID(N'[dbo].[Person]') AND name = 'DateOfBirth') 
BEGIN 
ALTER TABLE [dbo].[Person] ADD DateOfBirth DATETIME 
END 
Các vấn đề liên quan