Инструкция SQL для изменения значения столбца с тем же столбцом в предложении where

#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';
  

Если вы получаете ошибку преобразования типа, то я предполагаю, что у вас есть триггер в таблице, который вызывает проблему. Возможно, вы ошибаетесь, говоря, что тип изменился. Но даже если вы правы, триггер все равно может вызвать эту проблему.