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

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

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

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

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

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

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

3 ответа

Решение

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

Это не разрешено по умолчанию. Если бы были только строки, которые имели бы пробелы, с этим не было бы никаких проблем.

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

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

во-первых, после этого делай переделку.

Отключите Анси Предупреждения, прежде чем изменить свой стол.

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

Приведенные выше 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
Другие вопросы по тегам