SQL:ALTER COLUMN为更短的CHAR(n)类型

Dan*_*don 12 sql alter-table alter-column

我正在使用MS SQL SERVER 2003.我想更改其中一个表中的列,以使条目中的字符更少.这与此问题相同:更改表列以接受更多字符,除了我想要更少字符而不是更多字符.

我的一个表中有一个列,其中包含九位数的条目.以前在该表上工作的开发人员错误地将该列设置为包含十位数的条目.我需要将类型更改CHAR(10)CHAR(9).

按照上面讨论的讨论说明,我写了这个声明

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

这将返回错误消息"字符串或二进制数据将被截断".我看到我的九位数字符串有一个空格,使它们成十个数字.

如何告诉SQL Server丢弃额外空间并将我的列转换为CHAR(9)类型?

Fra*_*čik 14

我认为你得到了错误,因为该表中有一些值正好是10个字符长(没有尾随空格).因此,改变表格会将这些值减少到9.

默认情况下不允许这样做.如果只有字符串会有一些尾随空格,那就没问题了.

所以,如果你可以切割这些值,那就行了

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

首先,在那之后做改变.


Lie*_*ers 10

在更改表之前禁用Ansi警告.

SET ANSI_WARNINGS OFF
Run Code Online (Sandbox Code Playgroud)

请注意,如果您碰巧有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
Run Code Online (Sandbox Code Playgroud)