查询提供错误,指出将值转换为整数

时间:2017-07-21 12:50:36

标签: sql sql-server-2012 left-join

我有一个查询,我在其中进行多个连接以获取某些字段的文本值。问题是我不断收到错误说明

  

将varchar值'1774.14'转换为数据时转换失败   输入int。

以下是我的查询...

SELECT t1.changedon as [Changed On], t1.fldname as [Field Name],   
CASE WHEN (t1.Fldname='LastKnownProvider' and t1.oldValue > 1000) THEN coalesce((t4.ProviderName + ' (' + t4.ProviderAddress + ', ' + t4.ProviderCity + ')'),cast(t1.oldvalue as varchar))  ELSE coalesce(t2.label,cast(t1.oldvalue as varchar)) END as [Old Value],   
CASE WHEN (t1.Fldname='LastKnownProvider' and t1.newValue > 1000) THEN coalesce((t5.ProviderName + ' (' + t5.ProviderAddress + ', ' + t5.ProviderCity + ')'),cast(t1.Newvalue as varchar))  ELSE coalesce(t3.label, cast(t1.NewValue as varchar)) END as [New Value]   
CASE WHEN t1.Changedfrom ='Upload' THEN 'UPLOAD' ELSE 'manual' END AS [Upload/Manual]   
FROM tblFieldChanges t1   
LEFT JOIN tblReferenceData t2 on t1.oldvalue=cast(t2.id as varchar)   
LEFT JOIN tblReferenceData t3 on t1.newValue=cast(t3.id as varchar)   
left join tblProviders t4 on t1.oldvalue = cast(t4.ProviderID as varchar)  
left join tblProviders t5 on t1.NewValue = cast(t5.ProviderID as varchar)  
WHERE TblName = 'tblClients' AND PKID = 8558

我的tblFieldChanges表看起来像这样......

enter image description here 此表包含更新时发生的字段更改的数据,因此示例数据可能如下所示......

ID    tblName    FldName    PKID    Oldvalue   NewValue   ChangedOn   
17    tblClients Cost       19      1774.14    1775.19    7/21/2017 8:45am    

其他表名,主要是tblReferenceData和tblProviders都有一个ID和我抓取的文本值(特别是tblReferenceData)。任何人都知道我为什么会收到错误。它似乎不仅像错误中的情况那样出错,而且,如果我有一个文本值,如city(旧金山),我得到一个类似的错误,说明转换varchar时转换失败值'旧金山'到数据类型int。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

由于OP已声明数据类型无法更改。以下是在进行比较之前将OldValue和NewValue值转换为十进制的解决方案:

SELECT t1.changedon as [Changed On], t1.fldname as [Field Name],   
CASE WHEN (t1.Fldname='LastKnownProvider' and CAST(t1.oldValue AS DECIMAL(19,2)) > 1000) THEN coalesce((t4.ProviderName + ' (' + t4.ProviderAddress + ', ' + t4.ProviderCity + ')'),cast(t1.oldvalue as varchar))  ELSE coalesce(t2.label,cast(t1.oldvalue as varchar)) END as [Old Value],   
CASE WHEN (t1.Fldname='LastKnownProvider' and CAST(t1.newValue AS DECIMAL(19,2))  > 1000) THEN coalesce((t5.ProviderName + ' (' + t5.ProviderAddress + ', ' + t5.ProviderCity + ')'),cast(t1.Newvalue as varchar))  ELSE coalesce(t3.label, cast(t1.NewValue as varchar)) END as [New Value]   
CASE WHEN t1.Changedfrom ='Upload' THEN 'UPLOAD' ELSE 'manual' END AS [Upload/Manual]   
FROM tblFieldChanges t1   
LEFT JOIN tblReferenceData t2 on t1.oldvalue=cast(t2.id as varchar)   
LEFT JOIN tblReferenceData t3 on t1.newValue=cast(t3.id as varchar)   
left join tblProviders t4 on t1.oldvalue = cast(t4.ProviderID as varchar)  
left join tblProviders t5 on t1.NewValue = cast(t5.ProviderID as varchar)  
WHERE TblName = 'tblClients' AND PKID = 8558

这也可以通过使用字符串比较来完成,但这是一种非常糟糕的做法:

t1.oldValue > '1000'

相关问题