2009-12-02 45 views
7

Tôi muốn thay đổi một cột trong SQL Server từ kiểu int, để nhập văn bản, trong khi vẫn duy trì tên cột. Bảng với cột này có rất nhiều dữ liệu và tôi không muốn mất nó. SQL Server dường như không hỗ trợ các phôi tiềm ẩn hoặc rõ ràng từ int đến văn bản, nếu không điều này sẽ khá đơn giản. Vì vậy, làm thế nào bạn sẽ làm điều đó bằng cách sử dụng chỉ SQL?Trong cột SQL Server thay đổi kiểu int để nhập văn bản

+0

'văn bản' hoặc 'varchar'? –

+1

Có một vài câu trả lời sẽ giúp bạn giải quyết vấn đề của bạn, nhưng tôi chỉ muốn thêm rằng kiểu dữ liệu TEXT có rất nhiều "gotchas". Bạn gần như chắc chắn tốt hơn khi sử dụng VARCHAR (MAX) hoặc NVARCHAR (MAX) giả sử rằng bạn tại SQL 2005 hoặc mới hơn. Thậm chí nếu không, hãy cân nhắc sử dụng VARCHAR hoặc NVARCHAR rất lớn để thay thế. –

+0

bất kỳ lý do cụ thể nào cho văn bản thay vì nvarchar (tối đa)? – DForck42

Trả lời

7

Vì MS SQL Server (giống như hầu hết các cơ sở dữ liệu) không hỗ trợ trực tiếp thay đổi loại cột hiện tại, bạn sẽ phải thực hiện theo các bước. Con đường tôi đã giải quyết vấn đề như thế này trong quá khứ được (giả sử bảng của bạn được đặt tên là 'foo' và cột của bạn được đặt tên là 'bar'):

ALTER TABLE foo ADD COLUMN tempbar text; 
UPDATE foo SET tempbar = cast(cast(bar as varchar) as text); 
ALTER TABLE foo DROP COLUMN bar; 
ALTER TABLE foo ADD COLUMN bar text; 
UPDATE foo SET bar = tempbar; 
ALTER TABLE foo DROP COLUMN tempbar; 

(Một số cú pháp SQL có thể được tắt, nó được một năm kể từ lần cuối cùng tôi làm điều này, tại một công việc khác, vì vậy tôi không có quyền truy cập vào MS SQL Server hoặc nguồn. Bạn cũng sẽ phải làm nhiều thứ hơn nếu cột của bạn có chỉ mục trên đó.)

Đạo cụ để Donnie cho cú pháp chuyển đổi.

[Chỉnh sửa]

Tom H. đề nghị sử dụng các thủ tục lưu trữ sp_rename để đổi tên tempbar như bar (thay vì bước 4-6). Đó là một giải pháp MS SQL Server cụ thể có thể làm việc trong nhiều trường hợp. Giải pháp tôi mô tả sẽ hoạt động (với các sửa đổi cú pháp) trên bất kỳ cơ sở dữ liệu SQL nào, bất kể phiên bản. Trong trường hợp của tôi, tôi đã xử lý các khóa chính và khóa ngoài, và không chỉ là một trường duy nhất, vì vậy tôi đã phải đặt hàng cẩn thận tất cả các thao tác và di chuyển trên nhiều phiên bản của MS SQL Server.

+1

Thay vì thả, thêm lại, và sau đó điền thanh, bạn chỉ có thể thả nó và đổi tên tempbar. –

+0

sp_rename sẽ không hoạt động trong Sql CE. – Edgar

5

Chỉ cần truyền hai lần thông qua loại trung gian theo ý bạn muốn.

cast(cast(intField as varchar) as text)

+0

Tôi sẽ thử. Cảm ơn! Tại sao MS SQL không tự xử lý? – manu08

+1

'văn bản' là đặc biệt, bạn không thể kiểm tra tính bình đẳng, phải sử dụng chỉ mục văn bản đầy đủ, v.v., vì vậy chỉ những trường được biết chứa dữ liệu văn bản mới có thể là' cast'. – Donnie

0

Dưới đây là một kịch bản mẫu nhỏ mà hiển thị trên phương pháp có thể:

create table test (id int) 

create table test_tmp (id ntext) 


insert into test 
values (1) 
insert into test 
values (2) 

insert into test_tmp 
select convert(ntext,cast(id as nvarchar)) from test 

drop table test 

exec sp_rename 'test_tmp','test' 

Về cơ bản chúng ta tạo ra một bản sao của bảng, sau đó cư nó. Đầu tiên chúng ta chuyển đổi int thành nvarchar sau đó chúng ta lấy một giá trị văn bản. Cuối cùng, chúng ta thả bảng cũ và đổi tên bảng tạm thời.

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