我正在获得Select查询中的“转换”错误。
错误是:
Msg 248,第16级,状态1,第6行 nvarchar值'7000952682‘的转换溢出了int列。
问题是,我的表中没有int列!
以下是表的结构:

以下是查询:

如果我将@SU的值设置为NULL,那么它确实会按预期返回所有行。当该值被设置为字符串值'7000952682‘时,我将得到错误。
为什么Server试图将nvarchar值转换为int?
发布于 2018-04-27 14:09:20
CASE表达式的所有分支都必须具有相同的类型。在这种情况下(不打算使用双关语),看起来Server使用的是整数类型,并将SU隐式转换为整数。问题是Server中整数的最大值大约为21亿,您给出的示例是使用值7000952682,因此出现溢出。
你有两个选择。你可以让一切都变得varchar
CASE WHEN @SU IS NULL OR @SU = '' THEN '1' ELSE [SU] END或者,您可以使用不会溢出的类型,使所有内容都是数字的。
CASE WHEN @SU IS NULL OR @SU = ''
THEN CAST(1 AS numeric(20, 6))
ELSE CAST([SU] AS numeric(20, 6)) END另外,您可以使用CASE更简洁地编写COALESCE表达式的第一部分。
CASE WHEN COALESCE(@SU, '') = '' THEN '1' ELSE [SU] END发布于 2018-04-27 14:37:14
不要在case子句中使用where。逻辑更简单、更准确地表述为:
where (@su is null or @su = '' or @su = su)https://stackoverflow.com/questions/50063920
复制相似问题