SQL: ИЗМЕНИТЕ СТОЛБЕЦ к более короткому CHAR (n) тип

Я работаю с SQL-СЕРВЕРОМ 2003 MS. Я хочу изменить столбец в одной из моих таблиц, чтобы иметь меньше символов в записях. Это идентично этому вопросу: Изменение Столбца таблицы для Принятия Большего количества Символов за исключением того, что я хочу меньше символов вместо больше.

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

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

ALTER TABLE [MY_TABLE] ИЗМЕНЯЕТ СТОЛБЕЦ [MY_COLUMN] СИМВОЛ (9);

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

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

12
задан Community 23 May 2017 в 12:32
поделиться

2 ответа

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

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

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

UPDATE MY_TABLE SET MY_COLUMN = LEFT (MY_COLUMN, 9)

, а затем выполните изменение.

14
ответ дан 2 December 2019 в 06:25
поделиться

Отключите Предупреждения 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
10
ответ дан 2 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: