首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Server试图将我的nvarchar(20)数据类型转换为int?

为什么Server试图将我的nvarchar(20)数据类型转换为int?
EN

Stack Overflow用户
提问于 2018-04-27 13:55:00
回答 2查看 1.9K关注 0票数 2

我正在获得Select查询中的“转换”错误。

错误是:

Msg 248,第16级,状态1,第6行 nvarchar值'7000952682‘的转换溢出了int列。

问题是,我的表中没有int列!

以下是表的结构:

以下是查询:

如果我将@SU的值设置为NULL,那么它确实会按预期返回所有行。当该值被设置为字符串值'7000952682‘时,我将得到错误。

为什么Server试图将nvarchar值转换为int?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-27 14:09:20

CASE表达式的所有分支都必须具有相同的类型。在这种情况下(不打算使用双关语),看起来Server使用的是整数类型,并将SU隐式转换为整数。问题是Server中整数的最大值大约为21亿,您给出的示例是使用值7000952682,因此出现溢出。

你有两个选择。你可以让一切都变得varchar

代码语言:javascript
运行
复制
CASE WHEN @SU IS NULL OR @SU = '' THEN '1' ELSE [SU] END

或者,您可以使用不会溢出的类型,使所有内容都是数字的。

代码语言:javascript
运行
复制
CASE WHEN @SU IS NULL OR @SU = ''
     THEN CAST(1 AS numeric(20, 6))
     ELSE CAST([SU] AS numeric(20, 6)) END

另外,您可以使用CASE更简洁地编写COALESCE表达式的第一部分。

代码语言:javascript
运行
复制
CASE WHEN COALESCE(@SU, '') = '' THEN '1' ELSE [SU] END
票数 6
EN

Stack Overflow用户

发布于 2018-04-27 14:37:14

不要在case子句中使用where。逻辑更简单、更准确地表述为:

代码语言:javascript
运行
复制
where (@su is null or @su = '' or @su = su)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50063920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档