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