2013-06-27 103 views
-1

我一直在试图运行下面的程序,我不断收到错误连接问题:将数据类型nvarchar转换为float时出错?

错误转换数据类型为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 

当我发表评论out/*和A.Full_Name不为空* /程序起作用。

我想不出有什么错误的手段和为什么当我注释掉/ 联接作品*和A.Full_Name不为空*/

任何反馈表示赞赏。

谢谢!

+0

你尝试小写字母“A” a.Full_Name –

+0

是File_NBR数据类型参与加入基本表之间有什么不同? – mwigdahl

+0

嗨。我只是变成了小写字母,仍然没有工作。是的,File_NBR的数据类型可能不同,我将如何编写 - 我是SQL服务器的新手 – user2270911

回答

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或(更可能)连接谓词最终应用于包含无法转换为浮点的字符串的行,这会导致引发了一个例外。

如同您所做的那样,将a.File_NBRb.File_NBR转换为char是解决此问题的一种方法。你可以在事实上挑这四个字符串类型的任何:

  • char

  • varchar

  • nchar

  • nvarchar

由于其中一列已经是一个字符串(可能是a.File_NBR之一,但您可以更准确地找到该字符串),因此该转换可能仅适用于另一列。

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

+0

非常感谢!这是一个很好的解释! – user2270911

+0

+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 
相关问题