2011-12-08 39 views
5

Tôi có một cột có tên Lastmodified, với kiểu dữ liệu là Date, nhưng phải là DateTime.Chuyển đổi cột từ ngày sang ngày giờ Sql Server

Có cách nào để chuyển đổi cột không?

Khi tôi sử dụng 'Thiết kế' tính năng của SQL Server Management Studio tôi nhận được lỗi sau:

Saving changes is not permitted. The changes you have made require the following table to be dropped and re-created.

Không thực sự quan tâm đến việc thả bàn, tôi chỉ muốn biết nếu nó có thể chuyển đổi một từ Date đến Datetime hoặc tôi có phải xóa cột và tạo cột mới với loại dữ liệu chính xác không?

+0

Chắc chắn bạn có thể chuyển đổi này - nhưng làm như vậy, các nhà thiết kế hình ảnh trong SQL Server Mgmt Studio sẽ tạo ra bảng mới của bạn với 'DATETIME', sao chép dữ liệu, và sau đó thả bảng cũ, và có một tùy chọn trong 'Công cụ> Tùy chọn' để ngăn chặn điều đó theo mặc định - xem câu trả lời của tôi –

Trả lời

20

Không cần phải thả bảng và tạo lại bảng, trừ khi cột đó tham gia vào một hoặc nhiều ràng buộc.

Bạn chỉ có thể làm điều đó bằng SQL:

ALTER TABLE Tab ALTER COLUMN LastModified datetime2 not null 

(tôi đã chọn datetime2 qua datetime, kể từ khi cựu là recommended for all new development work, và kể từ cột hiện đang date, tôi biết bạn đang ở trên SQL Server 2008 hoặc sau)

+0

+1 Đây là một trong các lỗi SSMS. –

+0

Tôi đang sử dụng SQL Server có tên mã là "Denali" Management Studio, do đó, có vẻ như họ sẽ thay đổi, cách hoạt động của nó. – gulbaek

2

Đó chỉ là một khung cảnh an toàn trong SQL Server Mgmt Studio - bạn có thể tắt nó đi, nếu bạn thích mạo hiểm :-)

enter image description here

Vô hiệu hóa hộp kiểm ở đó và bạn có thể làm bất cứ điều gì bạn muốn!

+0

Nếu tùy chọn này bị tắt thì SQL Server sẽ bỏ qua' CONSTRAINT '? –

+0

@Igor: không, tôi không nghĩ vậy. Tùy chọn này chỉ ngăn các thay đổi đối với các bảng cơ sở dữ liệu mà trình thiết kế trực quan xử lý bằng cách tạo lại bảng (với cấu trúc mới) thay vì chỉ thực hiện một câu lệnh T-SQL đơn –

2

Bạn không thể thay đổi loại cột tại chỗ. Bạn cần phải tạo một cột mới, sao chép các giá trị trên, và sau đó thả cột ban đầu.

SQL Management Studio thường thực hiện việc này bằng cách tạo bảng tạm thời với tên cột mới, sao chép các giá trị trên, thả bảng gốc với cột cũ và sau đó đổi tên bảng tạm thời mới thành tên mới. Thường thì nó thực hiện điều này mà không có ai thậm chí nhận ra nó. Tuy nhiên, đây có thể là một cách tiếp cận rất xâm lấn, đặc biệt nếu bạn đã có nhiều hàng trong bảng, vì vậy bạn có thể chỉ cần viết một kịch bản lệnh SQL thêm cột mới vào bảng, sao chép các giá trị trên, thả cột ban đầu, và sau đó sử dụng sp_rename để thay đổi tên cột tạm thời mới trở lại tên cột ban đầu. Đây là ý tưởng giống như những gì SQL Management Studio đang làm, ngoại trừ việc chúng đang giảm và tái tạo toàn bộ bảng, và bạn chỉ cần thả và tạo lại cột.

Tuy nhiên, nếu bạn KHÔNG muốn để SQL Manangement Studio làm theo cách này, bạn có thể tắt thông báo lỗi đó. Tôi tin rằng nó ban đầu được thêm vào bởi vì mọi người không muốn bỏ đi và tạo lại bảng theo mặc định. Để tắt thông báo này, hãy chuyển đến Công cụ-> Tùy chọn-? Nhà thiết kế và bỏ chọn "Ngăn lưu thay đổi yêu cầu tạo lại bảng", sau đó bạn sẽ có thể lưu các thay đổi của mình trong nhà thiết kế.

Prevent saving changes that require table re-creation

+0

Bạn có thể thực hiện nó dễ dàng hơn nhiều. –

+0

Chăm sóc để xây dựng? –

+0

Xin lỗi. Tôi có nghĩa là câu trả lời của Damien_The_Unbeliever. –

Các vấn đề liên quan