SQL: ALTER COLUMN для более короткого CHAR (n) типа

Я работаю с MS SQL SERVER 2003. Я хочу изменить столбец в одной из моих таблиц, чтобы иметь меньше символов в записях. Это идентично этому вопросу: Изменение столбца таблицы для принятия большего количества символов, за исключением того, что я хочу меньше символов, а не больше.

У меня есть столбец в одной из моих таблиц, содержащий девятизначные записи. Разработчик, ранее работавший над таблицей, ошибочно установил столбец для хранения десятизначных записей. Мне нужно изменить тип от CHAR(10) до CHAR(9).

Следуя инструкциям из приведенного выше обсуждения, я написал выражение

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

Это возвращает сообщение об ошибке "Строка или двоичные данные будут усечены". Я вижу, что у моих девятизначных строк есть пространство, добавленное к десяти цифрам.

Как сообщить SQL Server об отбрасывании лишнего места и преобразовать мой столбец в тип CHAR (9)?

Ответ 1

Я думаю, что вы получили ошибку, потому что в этой таблице есть несколько значений, которые имеют ровно 10 символов (без конечных пробелов). Таким образом, изменение таблицы приведет к уменьшению этих значений до длины 9.

По умолчанию это недопустимо. Если бы были только строки, которые имели бы некоторые конечные пробелы, с этим не было бы проблем.

Итак, если вы в порядке с сокращением этих значений, сделайте

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

сначала, после этого сделайте alter.

Ответ 2

Отключите 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