2010-06-16 54 views
10

我正在使用MS SQL SERVER 2003.我想更改我的一個表中的列以使條目中的字符更少。這與這個問題是一樣的:Altering a Table Column to Accept More Characters除了我想要更少的字符而不是更多的字符。SQL:ALTER COLUMN到更短的CHAR(n)類型

我在我的一個表中有一列存放9位數的條目。之前在桌子上工作的開發人員錯誤地將該列設置爲保存十位數的條目。我需要將類型從CHAR(10)更改爲CHAR(9)

在從上面鏈接的討論中的說明,我寫的語句

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

這將返回錯誤消息「字符串或二進制數據將被截斷」。我看到我的九位字符串有一個附加空格,使它們成爲十位數字。

如何告訴SQL Server放棄額外空間並將我的列轉換爲CHAR(9)類型?

+0

@marc_s,sorry,typo – 2010-06-16 18:14:18

回答

11

我想你會得到這個錯誤,因爲表中有一些值恰好是10個字符(沒有尾隨空格)。因此更改表格會將這些值減少到9的長度。

這是默認情況下不允許的。如果只有那些會有一些尾隨空格的字符串,那就沒有問題了。

所以,如果你都OK與切割這些價值觀,做

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

第一,之後做聖壇。

+0

ACCEPTED:This works。This works。但有趣的是,沒有附加空格的值不會超過9個字符。然而,使用'ALTER'語句之前建議的'UPDATE'語句使其工作。 – 2010-06-16 14:27:56

+0

它的奇怪,但它確實有效:) – Muflix 2017-03-01 12:48:23

8

禁用Ansi Warnings,然後再更改表格。

SET ANSI_WARNINGS OFF 

謹防數據被截斷,如果你碰巧有事情10個字符長。

編輯

檢查實際上改變的是柱長度之前已有的長度。

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

我會在代碼中首先檢查第10個字節是否設置在任何地方,如果是的話會出錯。 – 2010-06-16 14:24:23