0

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

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”中;列不允许空值。更新失败。

我没有插入任何空值,但仍然收到此错误。有人可以帮助我为什么得到这个。

4

3 回答 3

5

ELSE子句添加到语句的末尾以捕获您的条件都不匹配的情况。那应该摆脱错误。所以像:

...
  when CurrencyId='SGD' then 'SG'
  when CurrencyId='TWD' then 'TW'
  when CurrencyId='ZAR' then 'ZA'
  else '??'
end
于 2011-07-06T15:28:38.743 回答
2

这是一个相当讨厌的案例陈述。我的猜测是您不匹配您的一个案例。

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

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

例如

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

然后手动执行异常。

虽然你对这个特定问题有答案很酷,但我的建议是找出模式,不要让自己的生活太难。

于 2011-07-06T15:33:14.470 回答
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
于 2011-07-06T15:33:40.217 回答