Trả lời trực tiếp câu hỏi, có hai cách để thực hiện thao tác.
- Nếu số lượng cột varchar liên quan trên bảng là nhỏ (một hoặc hai), thì việc tạo các cột giả tạm thời sẽ thực tế hơn
- Nếu số lượng cột varchar lớn hơn, cách trên không thực tế lắm - vì vậy bạn tạo một bảng giả. Điều này được sử dụng nhiều nhất trên các tập lệnh cập nhật siêu dữ liệu của một số công cụ cơ sở dữ liệu như ErWin hoặc ER / Studio (Tôi đã sử dụng cả hai công cụ và xem lại các tập lệnh được tạo trước khi áp dụng)
Lưu ý trên các bảng lớn : Nếu bảng có vài nghìn bản ghi hoặc ít hơn, bạn có thể thực hiện thao tác cùng một lúc. Trong trường hợp bảng triệu bản ghi, sẽ thực tế hơn khi thực hiện theo lô (giả sử 1000 hoặc 100 bản ghi mỗi lần).
Cột giả
Các cột giả tạm thời (tôi quên nếu có tên khác, tên thích hợp hơn) là các cột được sử dụng để lưu trữ kết quả của chuyển đổi. Trong trường hợp này, chúng cũng sẽ là cột cuối cùng sau quá trình.
- Tạo các cột mới với chiều dài dự định. Đừng quên bao gồm bất kỳ ràng buộc kiểm tra hoặc mặc định nào cho định nghĩa mới
- Thực hiện cập nhật (hoặc cập nhật, xem quan sát ở trên) để lưu trữ dữ liệu của cột cũ trong cột mới.
- Thực hiện sao lưu nhật ký và thực hiện kiểm tra, để không cho phép nhật ký phát triển lớn một cách vô lý.
- Nếu cột cũ có bất kỳ ràng buộc nào liên quan đến nó, hãy bỏ chúng.
- Thả cột cũ.
- Đổi tên cột mới thành tên cột cũ
- Xây dựng lại các chỉ mục bị ảnh hưởng (hoặc tất cả, nếu cột bị ảnh hưởng cũng là một phần của ràng buộc khóa chính cụm - hiếm khi ai đó sử dụng varar (n) làm PK, nhưng tôi đã thấy một số).
Đây là quá trình tương tự chi tiết trong câu trả lời của Aaron .
Bảng giả
Khi sửa đổi trong nhiều hơn một số cột, sẽ thực tế hơn khi tạo một bảng mới, dựa trên lược đồ của bảng cũ.
- Tạo một bảng mới, không có bất kỳ ràng buộc bảng nào (PK, FK, v.v.). Chỉ mang theo những cột tại thời điểm này (KHÔNG phải NULL, DEFAULT, KIỂM TRA, v.v.)
- Chèn dữ liệu vào bảng cũ trong bảng mới (xem Ghi chú trên các bảng lớn ở trên). SET IDENTITY_INSERT ở đây là bắt buộc.
- Bây giờ, bỏ tất cả các ràng buộc bảng (PK, FK, kiểm tra) và kích hoạt trên bảng cũ. Tái tạo các ràng buộc và kích hoạt trên bảng mới.
- Tái tạo tất cả các chỉ mục khác (tất cả cùng một lúc hoặc một lần, tùy thuộc vào cửa sổ bảo trì của bạn) của bảng cũ, trên bảng mới. Trừ khi bảng không có chỉ mục cụm, điều này phải được thực hiện sau bước 3. Hoặc, ít nhất, sau khi tạo ràng buộc PK.
- Kiểm tra xem mọi thứ đã ổn chưa (nếu bạn không quên trình kích hoạt hoặc ràng buộc trong quy trình) và, nếu tất cả đều ổn, hãy bỏ bảng cũ.
- Đổi tên bảng mới thành tên trên bảng cũ
Lưu ý ở bước 4 : Nếu bạn có bất kỳ chỉ mục trùng lặp nào được phát hiện (phát hiện các chỉ mục trùng lặp là một chủ đề rất dài, hãy xem blog của Kimberly Tripp trên SQLSkills.com), đó là cơ hội để bạn loại bỏ chúng nếu đó là trường hợp.
Ý nghĩa hiệu suất
Thay đổi từ VARCHAR thành NVARCHAR có một số hàm ý về hiệu suất, ít nhất là đối với bất kỳ Máy chủ SQL nào dưới 2008R2. Đối với SQL 2008 R2, Aaron Bertrand có một số bài đăng trên blog về tính năng nén Unicode - có thể chống lại sự cân bằng khi các cột NVarchar được sử dụng để lưu trữ nội dung có thể được lưu trữ trên các cột VARCHAR. Tôi đã không đọc chúng hoàn toàn vì các bài báo xứng đáng, nhưng chủ đề này rất thú vị.
Các cột NVARCHAR theo thời gian (IOW, trước 2008R2) lưu trữ tất cả các ký tự trong các cột với 2 byte mỗi char. Ví dụ: chuỗi 'MSSQL' sẽ được lưu trữ trong 5 byte trên cột VARCHAR và 10 trên cột NVARCHAR. Do các cột chuỗi không LOB bị giới hạn lưu trữ tối đa 8000 byte , điều đó có nghĩa là VARCHAR có thể lưu trữ 8000 ký tự, trong khi NVARCHR bị giới hạn ở 4000.
Ý nghĩa của sự thật đó:
- Vì các khóa chỉ mục được giới hạn ở 900 byte (xem tài liệu trên CREATE INDEX), nếu bạn cố gắng lập chỉ mục cột NVARCHAR (500), lệnh sẽ không thất bại (nếu đây chỉ là một cột trên khóa chỉ mục), nhưng nếu bạn CẬP NHẬT hoặc XÁC NHẬN một hàng có hơn 450 - (tổng kích thước của các cột khác trên khóa chỉ mục, nếu là trường hợp) các ký tự hoạt động sẽ thất bại.
- Càng nhiều byte để hoạt động, nhiều việc phải làm. Bạn đọc / ghi / so sánh / bộ nhớ cache gấp đôi byte.
- Tùy thuộc vào mức độ lớn của bảng, ảnh hưởng của các cột chuỗi đến kích thước được lưu trữ của bảng và mức độ tham gia của bảng trên kích thước cơ sở dữ liệu, bạn có thể mong đợi sự gia tăng về kích thước cơ sở dữ liệu (được sử dụng) và tất cả các biến mà nó ảnh hưởng trực tiếp hoặc không (như thời gian sao lưu / khôi phục, bảo trì chỉ mục, v.v.).
EDIT: như gbn đã nêu, không đáng để tạo ra thứ gì đó chỉ để sử dụng VARCHAR khi bạn có một yêu cầu rõ ràng cần các cột NVARCHAR được điền đầy đủ.