将 nvarchar 值“3255+”转换为数据类型 int 时转换失败。

Conversion failed when converting the nvarchar value '3255+' to data type int.

    /****** Script for SelectTopNRows command from SSMS  ******/
SELECT *


FROM Zuege as a

INNER JOIN [ResultateProzessModellZug_PF3_PF3_SimFV_2015_mNT_mSKT_L91_mZuschlaege_SKT] as b

ON a.ZuglaufID = b.Zuglaufid

LEFT JOIN [SysPue].[dbo].[VISUM_I_Knoten_Netz2015] as c
   on [KnotenNummer] = Nr

LEFT JOIN [SysPue].[dbo].[LINIE_I_Richtung_Fahrplan2015] as d
    on d.ZugNr = LineRouteName

WHERE Zugvariante = 216
and ModellzugID in (1,2,3,4,5,6,7,8,9,10)
and Qualitaetszug = 1
and Inland = 1

返回此错误:

Msg 245, Level 16, State 1, Line 2
Conversion failed when converting the nvarchar value '3255+' to data type int.

我是 SQL 的新手,我不知道哪里出了问题。感谢您的帮助。

鲍勃

该列中包含的数据包含无法转换为整数的值。

Plus + 值导致转换失败。使用一些代码删除 + 以清理字符串。 (提示:想到替换。)

查看比较中涉及的每一列的数据类型。在 JOINS 的 ON 子句和 WHERE 子句中可以找到比较。

任何时候将字符串 (varchar) 与数字(整数或其他数字类型)进行比较时,都需要将数字类型的列转换为字符串 (varchar)。否则 SQL 服务器将尝试将字符串隐式转换为数字,如果不能,它将引发您看到的错误。

因此,例如,如果您发现 Zugvariante 是一个 varchar,那么您需要通过将 216 放在单引号中来使 216 成为一个字符串,如下所示:

WHERE Zugvariante = '216'

如果d.ZugNr是一个数字而LineRouteName是一个字符串,那么您需要将它们都作为字符串进行比较:

CAST(d.ZugNr AS varchar(31)) = LineRouteName

我怀疑问题出在 INT 列和 NVARCHAR 列之间的 JOIN 之一,后者包含无法转换为整数的“3255+”。

我建议您检查以下列类型:

a.ZuglaufID and b.Zuglaufid
[KnotenNummer] and Nr
d.ZugNr and LineRouteName

并确保类型匹配。

WHERE 子句中包含的某些列不是整型字段。 要解决该问题,请将字符串作为字符串进行搜索。 示例:

SELECT *
FROM   Zuege as a
       INNER JOIN [ResultateProzessModellZug_PF3_PF3_SimFV_2015_mNT_mSKT_L91_mZuschlaege_SKT] AS b ON a.ZuglaufID    = b.Zuglaufid
       LEFT  JOIN [SysPue].[dbo].[VISUM_I_Knoten_Netz2015]                                    AS c ON [KnotenNummer] = Nr
       LEFT  JOIN [SysPue].[dbo].[LINIE_I_Richtung_Fahrplan2015]                              AS d ON d.ZugNr        = LineRouteName
WHERE Zugvariante   = 216 -- (IF [Zugvariante] IS VARCHAR)
  AND ModellzugID IN ('1','2','3','4','5','6','7','8','9','10') -- (IF [ModellzugID] IS VARCHAR)
  AND Qualitaetszug = '1' -- (IF [Qualitaetszug] IS VARCHAR)
  AND Inland        = '1' -- (IF [Inland] IS VARCHAR)