【问题标题】:SQL Server: Conversion failed when converting the varchar value '1,2'SQL Server:转换 varchar 值“1,2”时转换失败
【发布时间】:2017-01-18 06:21:46
【问题描述】:

我有这样的查询

select
    t.tiid, t.employeeid, t.remarks,
    dd.DocID, dd.Document, dd.DocuName
from
    ti t
inner join 
    History cth on cth.tiid = t.tiid
inner join 
    Downloads dd on dd.DocID = cth.DocID

我表中的数据是这样的

历史:

DocID            DocuName
1,2              abc.dox,def.docx

下载

DocID    DocuName         document
1        abc.docx         x3400000efg..
2        def.docx         xc445560000...

但是当我执行这个查询时,它会显示一个错误:

将 varchar 值 '1,2' 转换为数据类型 int 时转换失败。

【问题讨论】:

  • 您应该根据事物的外观重新设计您的历史记录表。为什么要存储应该在不同行中的值,用逗号分隔在一行中?

标签: sql sql-server tsql type-conversion


【解决方案1】:

历史的DocID是多个DocID已经用逗号组合,所以不能直接比较值(一个值vs多个值)。

您可以使用CHARINDEX检查多个值是否包含指定值。

为了确保子字符串完全匹配,需要一个分隔符来表示单个值,否则会得到错误的结果。 例如: CHARINDEX('1,','12,2,3') 会是 1,但实际上字符串中没有 1。

select 
 t.tiid,
 t.employeeid,
 t.remarks,
 dd.DocID,
 dd.Document,
 dd.DocuName
from ti t
inner join History cth on cth.tiid=t.tiid
inner join Downloads dd on CHARINDEX(','+LTRIM(dd.DocID)+',',','+cth.DocID+',')>0

【讨论】:

  • 赞成使用 CHARINDEX。但是你能解释一下 CharIndex 的逻辑而不是回答中的代码吗?
【解决方案2】:

正如错误所说,您正在尝试将字符串与 int 等同起来。您需要将 int DocID 转换为字符串并检查它是否存在于逗号分隔的 DocID 中。类似

SELECT t.tiid,
       t.employeeid,
       t.remarks,
       dd.DocID,
       dd.Document,
       dd.DocuName
FROM ti t
INNER JOIN History cth ON cth.tiid=t.tiid
INNER JOIN Downloads dd ON CHARINDEX(',' + CAST(dd.DocID AS VARCHAR(10)) + ',',',' + cth.DocID + ',')>0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2023-03-31
    相关资源
    最近更新 更多