一位来自同事的益智游戏,我无法弄明白......
update btd.dbo.tblpayroll
set empname = ( select b.Legal_Name
from ( SELECT Legal_Name,
Employee_ID
FROM Com.dbo.Workers
WHERE isnumeric(Employee_ID) = 1
) b
where b.Employee_ID = empnum
and b.Legal_name is not NULL
)
where empname is NULL
Msg 245,Level 16,State 1,Line 1 将varchar值'N0007'转换为数据类型int时转换失败。表别名b实际上是一个视图。
值'N0007'位于Workers表中。我不明白为什么它没有从正在加入的结果中过滤掉。
编辑:
实际上,别名确实返回了正确的行 - 所以isNumeric正在执行这项工作。答案 0 :(得分:2)
我怀疑优化器正在尝试在内部选择之前应用外部select的where子句。据推测,它认为它能够在Employee_ID上进行索引查找,从而在这种情况下实现更快的查询。尝试:
update btd.dbo.tblpayroll
set empname = ( select Legal_Name
from Com.dbo.Workers
where isnumeric(Employee_ID) = 1
and convert(varchar,Employee_ID)
= convert(varchar,empnum)
and Legal_name is not NULL)
where empname is NULL
将它们全部转换为varchar应该处理它。我认为它的效率远低于你想要的效率,因为如果先进行,那么isnumeric会强制进行表格扫描。
答案 1 :(得分:0)
也许N被认为是货币符号?您可以尝试将IsNumeric替换为
LIKE REPLICATE('[0-9]',/*length of Employee_ID*/)
或只是
LIKE '[0-9]%'
如果信不能在中间
答案 2 :(得分:0)
ISNUMERIC()
对于你想要做的事情来说是着名的不可靠。您需要an alternative, which I've been asking for here之类的this one。
答案 3 :(得分:0)
显而易见的是强制比较顺序,可能是从只有数字Employee_IDs的视图中获取名称,而不是完整的Workers表。