2015-10-07 43 views
0

您好所有我有,他们给了我下面的SQL代码客户端..SQL我可以在另一个表中将一个Integer连接到一个非整数吗?

select top 10 a.Login as Agent_Name, CallDateTime, h.PhoneNum as Client_DDI, ConnectTime, BridgeTime, CRC, * 

from history h 
join Agent a on h.AgentID = a.AgentID 
join contact c on h.DialID = c.trans_dialid 

where h.PhoneNum = '01619740881' 


order by h.CallDateTime desc 

失败作为h.dialid是一个没有整数,但仍然有一些,但c.trans_dialid是一个标准的整数,是有一种方法可以在加入之前在h.dialid周围放置''''吗?

已更新并添加了错误。 Msg 248,Level 16,State 1,Line 11 varchar值'-8956468456'的转换溢出了一个int列。

+0

请用您正在使用的数据库(推测是SQL Server)标记您的问题。 –

+0

你可以做CAST(h.DialID AS INT)吗? – Ric

+0

有些RDBM(如果不是全部的话)会做隐式转换,但是如果只有一个数据(来自字符串列)的值不是整数,它会中断,这似乎是你的情况。 –

回答

4

你可以join不同类型的列。毕竟,你得到的错误是运行时间错误不是编译时间错误,所以语法是允许的。这不是一个好主意,但我会做到这一点。

您的问题是转换失败。

在SQL Server 2012+,您可以使用try_convert()处理这个问题:如果值应该是没有前导零的整数

on try_convert(int, h.dialid) = c.trans_dialid 

,则显式转换为字符串是一个很好的解决方案:

on cast(h.dialid as varchar(255)) = c.trans_dialid 

但是真的,你应该修复你的数据结构。用于连接的列应该是相同的类型。这对性能的原因非常重要。通过使用不同的类型,可以防止优化器使用特定的优化。

重要的是,当一个表引用另一个表时,您应该有一个明确的外键关系。这种关系要求两个键具有相同的类型。所以,正确设置你的数据库,你不会有这个问题。

+0

感谢演员工作:D – Denslat

+0

此外,客户正在加入错误的列... – Denslat

相关问题