SQL: ALTER COLUMN для более короткого типа CHAR (n) - PullRequest
12 голосов
/ 16 июня 2010

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

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

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

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

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

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

Ответы [ 3 ]

14 голосов
/ 16 июня 2010

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

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

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

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

сначала, после этого сделай переделку.

10 голосов
/ 16 июня 2010

Отключить Предупреждения Анси перед тем, как изменить таблицу.

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
0 голосов
/ 25 октября 2018

Приведенные выше 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
...