#sql #sql-server
#sql #sql-server
Вопрос:
У меня есть база данных SQL Server, и я передумал, и вместо столбца в моей таблице, заданного как int
, я хочу изменить его на varchar
. Итак, я изменил тип на varchar(8)
и сохранил свои изменения в средстве SQL Server Management Studio (версия 17.0).
Похоже, что инструмент преобразовал значения int в varchars, когда я сохранил изменения. Я хочу изменить значение ‘1’ на ‘External’, ‘2’ на ‘SPTR’ и ‘3’ на ‘Other’. Я собирался использовать по одному значению за раз.
Это простая инструкция SQL, которую я пробовал:
UPDATE mytable
SET mycolumn = 'External'
WHERE mycolumn = '1'
Сообщение об ошибке, которое я получаю от SSMS, является
Ошибка преобразования при преобразовании значения varchar ‘External’ в тип данных int»
Это как если бы база данных считала, что тип является int
, но это не так, это varchar(8)
.
Комментарии:
1. Если этот запрос выдал эту ошибку, mycolumn не является varchar(8); это int.
2. Поскольку @DavidBrowne-Microsoft ваше изменение не прижилось. Вот TSQL
alter table mytable alter column mycolumn varchar(8) null
. Затем снова запустите обновление.3. Есть ли какие-либо триггеры в таблице?
Ответ №1:
Похоже, вы действительно не изменили тип данных. Это должно решить проблему.
ALTER TABLE mytable ALTER COLUMN mycolumn varchar(8);
GO
UPDATE mytable
SET mycolumn = CASE mycolumn WHEN '1' THEN 'External'
WHEN '2' THEN 'SPTR'
ELSE 'OTHER'
END;
Обратите внимание, что вы также можете обновить каждое значение одновременно, используя CASE
выражение. Вероятно, намного проще, чем 3 UPDATE
инструкции.
Комментарии:
1. Итак, я выполнил только команду alter table в средстве управления SQL Server, и все прошло нормально. Затем я запустил команду Update, и она возвращается с той же ошибкой. Не уверен, что происходит. Я даже вышел из SSM tool и перезагрузил свою систему (знаю, что это, вероятно, не помогло бы), но я все еще не уверен, почему это не работает.
2. Включаете ли вы
GO
@mdmenard (не то чтобы это должно было что-то изменить)? Я не могу воспроизвести проблему.3. Да, у меня тоже была инструкция GO.
4. Тогда я придерживаюсь своего заявления о том, что я не могу воспроизвести проблему, @mdmenard .Дэвид Браун, вероятно, думает о правильном пути, о том, что в таблице есть триггер или что-то в этом роде, о котором вы нам не рассказали.
Ответ №2:
ALTER TABLE mytable ALTER COLUMN mycolumn varchar(50);
SELECT DATALENGTH ('External')
возвращает 8
Насколько я знаю, varchar не использует все 50 байт, в вашем случае он использует только 8 для хранения «Внешнего» поля, почему бы вам не попробовать изменить размер таблицы.
Ответ №3:
Если вы изменили mycolumn
на строку, то должно сработать следующее:
UPDATE mytable
SET mycolumn = 'External'
WHERE mycolumn = '1';
Если вы получаете ошибку преобразования типа, то я предполагаю, что у вас есть триггер в таблице, который вызывает проблему. Возможно, вы ошибаетесь, говоря, что тип изменился. Но даже если вы правы, триггер все равно может вызвать эту проблему.