【发布时间】:2021-12-29 11:20:11
【问题描述】:
从 SQL Server 2008 R2 迁移到 SQL Server 2019 时遇到问题。 我的代码
DECLARE @str NVARCHAR(50) = 'all',
@int TINYINT = 1
DECLARE @tmp TABLE (val nvarchar(MAX))
INSERT INTO @tmp VALUES('123')
INSERT INTO @tmp VALUES('all')
SELECT val
FROM @tmp
WHERE @str = 'ALL' OR @int = val
使用 SQL Server 2008 R2 时,没问题。预期的输出如下所示
val
123
all
但是,当我迁移到 SQL Server 2019 时,出现如下错误。此外,它只是在 2019 年不寻常地发生。
消息 245 级别 16 状态 1 第 8 行转换失败时转换 nvarchar 值 'all' 到数据类型 int。
如你所见,第二个条件OR @int = val意外发生了。
我想知道它是否由于与 OR operator 或 case sensitive ALL 与 all 的顺序相关的任何重大更改而失败下一个 SQL Server 2008 R2 版本。
更新
对不起,我的重现代码让你们感到困惑。 This is my original code
【问题讨论】:
-
错误在这里告诉你问题。在没有收到此错误之前,您似乎只是“幸运”。
'all'显然不是tinyint,但它会在WHERE中隐式转换为1。@int应该是varchar;您将它与最多可容纳约 10 亿个字符的数据类型进行比较。 -
不。实际上
@tmp表看起来像[strSplit]this。所以你可以忽略val nvarchar(MAX)。 @Larnu 先生,我只是重现以使我的代码尽可能简单 -
代码一开始就有缺陷,@NguyễnVănPhong。就像我说的,你以前很幸运。从本质上讲,它是一颗定时炸弹。好吧,非常很幸运,以前在您的生产环境中没有发生这种情况。
-
我完全同意你们两个我们不应该比较
tinyint with nvarchar(max)。我的代码应该是这样的WHERE @str = 'ALL' OR (@str <> 'ALL' AND @int = val),对吧? -
嗯,好的。 Here's an answer on this site with good info 和 an article,但您也可以相信,在这里回答您的帮助请求的专家不会对您撒谎。看看,如果你愿意改变你的代码,为什么不直接改变它呢?
标签: sql-server sql-server-2008-r2 sql-server-2019