什么是 SQL Server 2005 插入表选择查询的预期行为,其中一列尝试转换空值



我们在一些遗留的SQL Server 2005代码中有一个语句,例如

insert into myTable
select distinct 
wherefield1, 
wherefield2,
anotherfield,
convert(numeric(10,2), varcharfield1),
convert(numeric(10,2), varcharfield2),
convert(numeric(10,2), varcharfield3),
convert(datetime, varcharfield4),
otherfields
from myStagingTable
where insertflag='true'
and wherefield1 = @wherevalue1
and wherefield2 = @wherevalue2

在代码的前面,设置了一个变量来确定 varcharfield1 或 varcharfield2 是否为空,并且插入被编程为只要其中一个不为空就执行。

我们知道,如果 varcharfield1、varcharfield2 或 varcharfield3 是非数字字符串,则会引发异常,并且不会发生插入。 但是当这些变量之一为空时,我对这种行为感到困惑,因为它通常是这样。 实际上,这些值之一始终为空。 但似乎插入确实发生了。 看起来遗留代码依赖于此来防止仅插入非数字字符数据,同时允许插入空值或空值(在前面的步骤中,myStagingTable 的这些字段中的所有空字符串都替换为空值)。

多年来,它一直在具有所有默认设置的生产 SQL Server 2005 实例上运行。 如果我们升级到较新版本的 SQL Server,是否可以依赖此行为?

谢谢

丽贝卡

NULL到任何东西的转换仍然NULL。如果列允许NULL,这就是你会得到的。如果列不可为空,它将失败。

您可以自己看到这一点,甚至无需插入。只需运行这个:

SELECT CONVERT(numeric(10,2), NULL)

并注意它如何产生NULL结果。然后运行以下命令:

SELECT CONVERT(numeric(10,2), 'x')

并注意它如何抛出错误消息而不是返回任何内容。

最新更新