join的问题:将数据类型nvarchar转换为float时出错?

时间:2013-06-27 19:25:32

标签: sql-server

我一直在尝试运行下面的程序而且我一直在收到错误

  

将数据类型nvarchar转换为float

时出错

SQL:

SELECT 
   distinct 
    coalesce(a.File_NBR,b.File_NBR) as ID,
    b.Division,
    b.Program,
    a.Full_Name,
    a.SBC_RESULT
FROM 
    New_EEs.dbo.vw_SBC_RESULTS a
full join 
    New_EEs.dbo.vw_SBC_Employee_Info b on a.File_NBR = b.File_NBR
where 
    (a.File_NBR is not null OR b.File_NBR is not null)
    and A.Full_Name is not null 
order by 
    a.Full_Name, b.Division,  b.Program

当我注释掉/ *并且A.Full_Name不为空* /该程序有效。

当我注释掉/ *并且A.Full_Name不为空* /

时,我无法弄清楚错误的含义以及为什么连接有效

感谢任何反馈。

谢谢!

2 个答案:

答案 0 :(得分:4)

错误消息清楚地表明该问题与将nvarchar转换为float有关。您的查询中没有显式转换,因此它是隐式转换。如果问题确实源于这个特定的查询而不是来自其他地方,那么只有两个地方可以负责:

1)连接谓词;

2)COALESCE电话。

这两个地方都涉及同一对列a.File_NBRb.File_NBR。因此,其中一个必须nvarchar列,另一个为float列。由于float类型的优先级高于nvarchar,后者将隐式转换为前者,而不是相反。显然其中一个字符串值无法转换。这是对即时问题(转换)的解释。

我看到你的评论,其中一列是int而另一列是float。我没有问题,因为我相信你在谈论物理表中的列,而这个查询中的两个源看起来都是视图,从它们的名称来判断。我相信其中一个列在视图中享有到nvarchar的转换,并且此查询最终会看到它。所以,这应该考虑到nvarchar可以来自哪里。

至于为什么评论一个看似无关紧要的条件的解释似乎产生如此大的差异,答案必须在于查询规划器工作的内部。虽然Transact-SQL SELECT查询中有documented order of logical evaluation个子句,但实际的物理顺序可能与此不同。为查询选择的实际计划确定了物理顺序。并且计划的选择可能会受到影响,特别是通过纳入或消除简单条件这样的微不足道的事情。

要将其应用于您的情况,当有问题的条件被注释掉时,计划程序会为查询选择这样一个计划,即连接谓词和COALESCE表达式只有在能够导致问题的所有行都有时才会计算已被基础视图中的谓词过滤掉。但是,当放回条件时,会为查询分配不同的执行计划,并且COALESCE或(更可能)连接谓词最终应用于包含无法转换为float的字符串的行,这会导致提出异常。

正如您所做的那样,将a.File_NBRb.File_NBR转换为char是解决问题的一种方法。实际上,您可以选择以下四种字符串类型中的任何一种:

  • char

  • varchar

  • nchar

  • nvarchar

由于其中一列已经是一个字符串(可能是a.File_NBR字符串,但您可以更好地找到它),转换只能应用于另一个。

或者,您可以查看生成nvarchar列的视图,以查看是否可以首先消除intnvarchar转换。

答案 1 :(得分:0)

请参阅此example,也许会有用。

CREATE TABLE TEST(
ID FLOAT)

INSERT INTO TEST(ID) VALUES(NULL)
INSERT INTO TEST(ID) VALUES(12.3)

--SELECT COALESCE(ID,'TEST') FROM TEST; NOT WORKING ERROR:Error converting data type nvarchar to float
SELECT COALESCE(CAST(ID AS VARCHAR),'TEST') FROM TEST; --WORKS