Невозможно вставить значение NULL в столбец при попытке обновить столбец в SQL

Я пытаюсь обновить значения столбца, который не равен нулю, используя приведенный ниже запрос.

update Bom set CountryCode=
case
when CurrencyId='CHF' then 'CH' 
when CurrencyId='NZD' then 'NZ'
when CurrencyId='KRW' then 'KR'
when CurrencyId='HKD' then 'HK'
when CurrencyId='MXN' then 'MX' 
when CurrencyId='USDe' then 'DE'
when CurrencyId='JPY' then 'JP'
when CurrencyId='EUR' then 'DE'
when CurrencyId='DKK' then 'DK' 
when CurrencyId='GBP' then 'GB'
when CurrencyId='AUD' then 'AU'
when CurrencyId='RMB' then 'CN'
when CurrencyId='USDu' then 'US' 
when CurrencyId='NOK' then 'NO'
when CurrencyId='CAD' then 'CA'
when CurrencyId='USDm' then 'MX'
when CurrencyId='SEK' then 'SE'
when CurrencyId='SGD' then 'SG'
when CurrencyId='TWD' then 'TW'
when CurrencyId='ZAR' then 'ZA'
end

но по какой-то причине я получаю сообщение об ошибке

Не удается вставить значение NULL в столбец CountryCode таблицы Mouser_BOM.dbo.Bom; столбец не допускает пустых значений. ОБНОВЛЕНИЕ не проходит.

Я не вставляю никаких нулевых значений, но все равно получаю эту ошибку. Может кто-нибудь помочь, почему я получаю это.


person user648610    schedule 06.07.2011    source источник
comment
Какой CurrencyId вы передаете? Рассматривали ли вы добавление значения по умолчанию в свой оператор case на тот случай, если вы получите нераспознанный CurrencyId?   -  person Brandon    schedule 06.07.2011


Ответы (3)


Добавьте предложение ELSE в конец своего оператора, чтобы выявить случай, когда ни одно из ваших условий не соответствует. Это должно избавиться от ошибки. Итак, что-то вроде:

...
  when CurrencyId='SGD' then 'SG'
  when CurrencyId='TWD' then 'TW'
  when CurrencyId='ZAR' then 'ZA'
  else '??'
end
person Perception    schedule 06.07.2011
comment
Мои мысли точно - проверьте также свои начальные данные, но вы должны добавить какой-то случай по умолчанию. - person Clockwork-Muse; 06.07.2011
comment
@user648610: Возьмите за привычку принимать лучший ответ, решающий вашу проблему. Это правильно и вежливо делать на StackOverflow, и это служит стимулом для других продолжать помогать тем, кто ищет ответы. см. FAQ - person marc_s; 06.07.2011
comment
Re: marc_s - Делает мир счастливее, улыбается всем! :) - person MatBailie; 06.07.2011

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

Глядя на это, не проще ли добиться того же самого другим способом?

За некоторыми исключениями, почти все ваши обновления могут выполняться с помощью подстроки.

e.g.

UPDATE
  BOM
SET 
  CountryCode = SUBSTRING(CountryCode,1,2)
WHERE
  CountryCode IN
(
  'CHF',
  'HKD'
  -- the rest of these go here
)

Затем сделайте исключения вручную.

Хотя это здорово, что у вас есть ответ на эту конкретную проблему, мой совет — выявлять закономерности и не усложнять себе жизнь.

person Paul Alan Taylor    schedule 06.07.2011

Во-первых, ваше изложение дела может быть упрощено.

 CASE CurrencyId 
 WHEN 'CHF' THEN 'CH'
 WHEN 'NZD' THEN 'NZ' 
 WHEN 'KRW' THEN 'KR' 
 END

Во-вторых, должно быть условие, которое не соответствует ни одному из них. Сделайте выбор, чтобы найти его:

        SELECT *
        FROM Bom
        WHERE case CurrencyId 
        when 'CHF' then 'CH' 
        when 'NZD' then 'NZ' 
        when 'KRW' then 'KR' 
        ...
        end IS NULL
person JBrooks    schedule 06.07.2011
comment
это выглядит намного лучше. Спасибо - person user648610; 06.07.2011