大家好,我有一个客户端,他们给了我以下SQL代码..
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.didid?
已更新并添加了错误。 Msg 248,Level 16,State 1,Line 11 varchar值'-8956468456'的转换溢出了一个int列。
答案 0 :(得分: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
但实际上,您应该修复数据结构。用于连接的列应该是相同的类型。出于性能原因,这非常非常重要。通过使用不同的类型,可以防止优化程序使用特定的优化。
同样重要的是,当一个表引用另一个表时,您应该具有明确的外键关系。这种关系要求两个键具有相同的类型。因此,正确设置数据库,您将不会遇到此问题。