将 nvarchar 值“01HP011”转换为数据类型 int 时转换失败

Conversion failed when converting the nvarchar value '01HP011' to data type int

我在一台服务器上遇到转换错误,但在另一台服务器上没有,两者都有相同的数据库,一个是测试版,另一个是实时版,测试版实际上是实时版的副本,但有点旧。实时服务器启用了 AlwaysOn。 当我 运行 在两台服务器上打印 @@version 时,我得到关注

Microsoft SQL Server 2016 (SP1-CU1) (KB3208177) - 13.0.4411.0 (X64) 
    Jan  6 2017 14:24:37 
    Copyright (c) Microsoft Corporation
    Standard Edition (64-bit) on Windows Server 2016 Standard 6.3 <X64> (Build 14393: ) (Hypervisor)

这是 sql 查询,我是 运行


exec sp_executesql N'select * From DataTable
WHERE DT1 = @P1 AND DT2 = @P2
order by
cp1',N'@P1 smallint,@P2 smallint',0,0

列 DT2 的混合值为 1 和 1BAC 以及 NULL,但我不明白为什么它在一台服务器上工作,但在其他服务器上不工作。

看起来 dt2 被定义为字符串,而不是数字。您应该将参数的数据类型与正确的数据类型对齐 - 否则 SQL 服务器会尝试将字符串强制转换为数字,但在 '1ABC':

这样的值上会失败

考虑:

exec sp_executesql 
    N'select * From DataTable WHERE DT1 = @P1 AND DT2 = @P2 order by cp1',
    N'@P1 smallint, @P2 nvarchar(10)', 0, '0'

您可能需要检查参数字符串的大小,并确保其他参数没有同类问题。


为什么你的代码在一台服务器上失败而在另一台服务器上失败很可能与你的数据有关:dt2 中的所有值都可以转换为数字,或者可能是另一个 where 谓词在服务器尝试转换之前消除“错误”值。

这里 a demo 演示了这一点。

示例数据:

dt1 | dt2  |  cp1
--: | :--- | ---:
  0 | 1    | null
  0 | 1ABC | null
  0 | null | null

此操作因转换错误而失败:

exec sp_executesql 
    N'select * From DataTable WHERE DT1 = @P1 AND DT2 = @P2 order by cp1',
    N'@P1 int, @P2 int', 0, 10

这有效(并且 return 一个空结果集):

exec sp_executesql 
    N'select * From DataTable WHERE DT1 = @P1 AND DT2 = @P2 order by cp1',
    N'@P1 int, @P2 int', 1, 10