14

我正在使用 MS SQL SERVER 2003。我想更改我的一个表中的一列以减少条目中的字符。这与这个问题相同:Altering a Table Column to Accept More Characters除了我想要更少的字符而不是更多的事实。

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

按照上面链接的讨论中的说明,我写了声明

更改表 [MY_TABLE] 更改列 [MY_COLUMN] CHAR(9);

这将返回错误消息“字符串或二进制数据将被截断”。我看到我的九位数字符串附加了一个空格,使它们成为十位数。

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

4

3 回答 3

16

我认为您会收到错误消息,因为该表中有一些值正好是 10 个字符长(没有尾随空格)。因此,更改表格会将这些值削减为长度 9。

默认情况下不允许这样做。如果只有带有一些尾随空格的字符串,那将没有问题。

所以,如果你同意削减这些值,做

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

首先,在那之后做改变。

于 2010-06-16T14:16:55.653 回答
11

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

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
于 2010-06-16T14:18:22.517 回答
0

上述 2 个答案对我不起作用,因为我在试图更改的表上附加了一个历史表。这就是我所做的:

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)
ALTER TABLE MY_TABLE SET (SYSTEM_VERSIONING = OFF)
-- Might need to UPDATE MY_TABLEHistory SET MY_COLUMN = LEFT(MY_COLUMN, 9)
-- I didn't
ALTER TABLE MY_TABLEHistory ALTER COLUMN [MY_COLUMN] [varchar] (9) NULL
ALTER TABLE MY_TABLE SET (SYSTEM_VERSIONING = ON(HISTORY_TABLE = MY_TABLEHistory))
ALTER TABLE MY_TABLE ALTER COLUMN [MY_COLUMN] [varchar] (9) NULL
于 2018-10-24T21:00:07.757 回答