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