2010-06-16 26 views
10

Tôi đang làm việc với MS SQL SERVER 2003. Tôi muốn thay đổi một cột trong một trong các bảng của tôi để có ít ký tự hơn trong các mục nhập. Điều này giống với câu hỏi này: Altering a Table Column to Accept More Characters ngoại trừ thực tế là tôi muốn ít ký tự hơn thay vì nhiều hơn.SQL: ALTER COLUMN để ngắn hơn CHAR (n) loại

Tôi có một cột ở một trong các bảng chứa các mục nhập có 9 chữ số. Một nhà phát triển trước đây làm việc trên bàn đã nhầm lẫn đặt cột để giữ các mục có mười chữ số. Tôi cần phải thay đổi loại từ CHAR(10) thành CHAR(9).

Tiếp theo các hướng dẫn từ các cuộc thảo luận liên kết ở trên, tôi đã viết báo cáo kết quả

ALTER TABLE [MY_TABLE] ALTER COLUMN [MY_COLUMN] CHAR (9);

Trả về thông báo lỗi "Chuỗi hoặc dữ liệu nhị phân sẽ bị cắt bớt". Tôi thấy rằng các chuỗi chín chữ số của tôi có một không gian được nối thêm để làm cho chúng có mười chữ số.

Làm cách nào để yêu cầu SQL Server loại bỏ khoảng trống thừa và chuyển cột của tôi thành loại CHAR (9)?

+0

@marc_s, xin lỗi, typo –

Trả lời

11

Tôi nghĩ bạn nhận được lỗi vì có một số giá trị trong bảng đó chính xác là 10 ký tự (không có dấu cách). Thay đổi bảng do đó sẽ cắt các giá trị này thành độ dài 9.

Điều này không được phép theo mặc định. Nếu chỉ có các chuỗi sẽ có một số dấu cách, thì sẽ không có vấn đề gì với điều đó.

Vì vậy, nếu bạn là ok với cắt những giá trị, làm

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

đầu tiên, sau đó làm bàn thờ.

+0

CHẤP NHẬN: Tính năng này hoạt động. Tuy nhiên, điều thú vị là không có giá trị nào dài hơn 9 ký tự mà không có khoảng trống được nối thêm. Tuy nhiên, sử dụng câu lệnh 'UPDATE' mà bạn đề xuất trước câu lệnh' ALTER' làm cho nó hoạt động. –

+0

lạ của nó nhưng nó thực sự hoạt động :) – Muflix

8

Tắt Ansi Warnings trước khi bạn thay đổi bảng.

SET ANSI_WARNINGS OFF 

Cẩn thận dữ liệu mà sẽ được rút ngắn nếu bạn xảy ra để có một cái gì đó 10 ký tự.

Sửa

Kiểm tra độ dài hiện có trước khi thực sự thay đổi chiều dài cột.

SET ANSI_WARNINGS OFF 
GO 

CREATE TABLE Test (Value CHAR(10)) 
INSERT INTO Test SELECT ('1234567890') 

IF NOT EXISTS (SELECT * FROM Test WHERE LEN(Value) > 9) 
    ALTER TABLE Test ALTER COLUMN Value CHAR(9) 
ELSE 
    SELECT LEN(Value), * FROM Test WHERE LEN(Value) > 9 

DROP TABLE Test 
+1

Tôi muốn đưa vào mã để kiểm tra đầu tiên nếu byte thứ 10 được đặt ở bất cứ đâu, và lỗi nếu nó là. –

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