“尝试更新SQL中的列时,无法将值插入列”

时间:2011-07-06 15:25:22

标签: sql notnull

我正在尝试使用下面的查询更新非空列的值

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';专栏没有   允许空值。更新失败。

我没有插入任何空值但仍然出现此错误。有人可以帮我解决这个问题。

3 个答案:

答案 0 :(得分:5)

在语句末尾添加 ELSE 子句,以捕获所有条件都不匹配的情况。那应该摆脱错误。如下所示:

...
  when CurrencyId='SGD' then 'SG'
  when CurrencyId='TWD' then 'TW'
  when CurrencyId='ZAR' then 'ZA'
  else '??'
end

答案 1 :(得分:2)

那是一个相当讨厌的案例陈述。我的猜测是你没有匹配你的一个案例。

看着它,以不同的方式实现同​​样的事情是不是更容易?

除了少数例外,几乎所有的更新都可以使用子字符串完成。

e.g。

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

然后手动执行例外处理。

虽然你对这个具体问题的答案很酷,但我的建议是发现模式,而不是让自己的生活过于艰难。

答案 2 :(得分:0)

首先,您的案例陈述可以简化。

 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