-1

我一直在尝试运行下面的程序,但我不断收到错误

将数据类型 nvarchar 转换为浮点数时出错

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 不为空 * /

任何反馈表示赞赏。

谢谢!

4

2 回答 2

4

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

1) 连接谓词;

2) COALESCE 调用。

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

我已经看到您的评论,您说其中一列是 anint和另一列float。我对此没有任何问题,因为我相信您正在谈论物理表中的列,而此查询中的两个源似乎都是视图,从它们的名称来看。我相信其中一列喜欢nvarchar在视图中转换,而这个查询最终会看到它。所以,这应该说明你nvarchar可以从哪里来。

至于为什么将看似不相关的条件注释掉似乎会产生如此大的差异的解释,答案必须在于查询计划器的工作原理。虽然在 Transact-SQL SELECT 查询中有记录的子句逻辑评估顺序,但实际的物理顺序可能与此不同。为查询选择的实际计划决定了物理顺序。并且计划的选择可能会受到影响,特别是受到诸如合并或消除简单条件之类的琐碎事情的影响。

要将其应用于您的情况,当有问题的条件被注释掉时,计划程序会为查询选择这样一个计划,即连接谓词和 COALESCE 表达式仅在所有能够导致相关问题的行都被过滤掉时才进行评估通过基础视图中的谓词。然而,当条件被放回时,查询被分配了不同的执行计划,并且 COALESCE 或(更有可能)连接谓词最终被应用于包含无法转换为浮点数的字符串的行,这导致引发异常。

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

  • char

  • varchar

  • nchar

  • nvarchar

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

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

于 2013-06-27T22:13:35.277 回答
0

请看这个例子,也许会有用。

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
于 2013-06-27T22:22:48.503 回答