Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL Server 2005在其中一列尝试转换空值的情况下,insert into table select查询的预期行为是什么_Sql Server 2005_Null_Type Conversion_Sql Insert - Fatal编程技术网

Sql server 2005 SQL Server 2005在其中一列尝试转换空值的情况下,insert into table select查询的预期行为是什么

Sql server 2005 SQL Server 2005在其中一列尝试转换空值的情况下,insert into table select查询的预期行为是什么,sql-server-2005,null,type-conversion,sql-insert,Sql Server 2005,Null,Type Conversion,Sql Insert,我们在一些旧式SQLServer2005代码中有一个语句,如 insert into myTable select distinct wherefield1, wherefield2, anotherfield, convert(numeric(10,2), varcharfield1), convert(numeric(10,2), varcharfield2), convert(numeric(10,2), varcharfield3), con

我们在一些旧式SQLServer2005代码中有一个语句,如

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是否为null,并且只要其中一个不为null,insert就被编程为执行

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

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

谢谢


Rebeccah

NULL
转换为任何内容仍然是
NULL
。如果该列允许
NULL
,您将得到该列。如果该列不可为null,它将失败

你甚至不用插入就可以看到这一点。只需运行以下命令:

SELECT CONVERT(numeric(10,2), NULL)
SELECT CONVERT(numeric(10,2), 'x')
并注意它如何生成
NULL
结果。然后运行以下命令:

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

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

当然,你是对的。一位同事建议尝试转换空值是导致错误日志条目出现buch的原因,但事实证明这些错误是由尝试转换非数字字符串引起的。直到后来,我才意识到代码的作者专门将空值转换为空值以避免引起错误,并将非数字字符串转换错误保留为未捕获,以防止插入并强制人类眼球查看数据。