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

Mik*_*keA 2 sql t-sql sql-server

我在SQL Select查询中收到"转换"错误.

错误是:

消息248,级别16,状态1,行6
nvarchar值'7000952682'的转换溢出了一个int列.

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

这是表结构:

在此输入图像描述

这是查询:

在此输入图像描述

如果我将值设置@SUNULL,则它会按预期返回所有行.当值设置为字符串值'7000952682'时,我收到错误.

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

Tim*_*sen 6

CASE表达式的所有分支必须具有相同的类型.在这种情况下(没有双关语),看起来SQL Server正在使用整数类型并执行隐式强制转换SU为整数.问题是SQL Server中一个整数的最大值大约是21亿,你给出的例子是使用该值7000952682,因此溢出.

你有两个选择.你可以做一切varchar:

CASE WHEN @SU IS NULL OR @SU = '' THEN '1' ELSE [SU] END
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用不会溢出的类型将所有内容都设为数字,例如

CASE WHEN @SU IS NULL OR @SU = ''
     THEN CAST(1 AS numeric(20, 6))
     ELSE CAST([SU] AS numeric(20, 6)) END
Run Code Online (Sandbox Code Playgroud)

作为旁注,您可以CASE使用COALESCE以下内容更简洁地编写表达式的第一部分:

CASE WHEN COALESCE(@SU, '') = '' THEN '1' ELSE [SU] END
Run Code Online (Sandbox Code Playgroud)