【问题标题】:SQL: Conversion failed when converting the nvarchar value 'XXX' to data type intSQL:将 nvarchar 值“XXX”转换为数据类型 int 时转换失败
【发布时间】:2018-06-14 18:04:42
【问题描述】:

我收到“将 nvarchar 值“XXX”转换为数据类型 int 时出现“转换失败”错误,原因不明,我不知道如何解决。该视图实际上将正确的数据返回到存储过程,但它给了我这个错误。我被困住了。有大神指点一下吗?

SELECT          d.Code, a.Agency, a.Agency_job, a.OUCode, a.JobCode, d.OraUser, c.ProfileName
FROM            dbo.Agency AS a 
LEFT OUTER JOIN dbo.IdM AS d ON REPLACE(STR(a.OUCode, 3), ' ', '0') = d.OrganizationUnitCode AND a.JobCode = d.JobCode 
LEFT OUTER JOIN dbo.Profiles AS c ON c.JobCode = a.JobCode AND c.OUCode = a.OUCode
WHERE          (d.Code IS NOT NULL)

列详细信息 -

 d.Code is nvarchar(32),
 d.OraUser is nvarchar(100),
 d.OrganizationUnitCode is nvarchar(16),
 a.Agency is int,
 a.Agency_job is int,
 a.OUCode is int,
 a.JobCode is int,
 c.ProfileName is varchar(100),
 c.OUCode is int,
 c.JobCode is int.

有没有人发现潜在的问题?

【问题讨论】:

  • WHERE 子句条件使得第一个 LEFT JOIN 返回常规的 INNER JOIN 结果。
  • 好像 a.OUCode 包含一些非数字值。
  • 您的查询中没有从字符串到整数的转换(只有整数到字符串)。您确定您发布了完整的查询或使用了正确类型的列吗?
  • @Fabio 我仔细检查了类型,它们与我写的一样。这是一个完整的查询 - 我在存储过程中使用的视图。
  • @jarlh 我检查了表格中的 a.OUCode,它不包含任何非数字值。

标签: sql sql-server tsql


【解决方案1】:

在您的查询中发生错误是正常的!

REPLACE(STR(a.OUCode, 3), ' ', '0') 是字符串类型,但连接谓词右侧的 d.OrganizationUnitCode 是一个 int。所以它不能在这里隐式地进行转换,要么将 int 字段转换为 nvarchar ,要么反过来。你可以试试这样的:

cast(REPLACE(STR(a.OUCode, 3), ' ', '0') as int) = d.OrganizationUnitCode

【讨论】:

  • a.OUCode 是 int,d.OrganizationUnitCode 是字符串。仍然尝试了你的建议,我得到了同样的错误。
【解决方案2】:

如果您的表中有 OUCode > 999,则 STR(a.OUCode, 3) 将返回 *** 尝试转换为 int 时会出现错误

Conversion failed when converting the varchar value '***' to data type int.

来自在线书籍:https://docs.microsoft.com/en-us/sql/t-sql/functions/str-transact-sql?view=sql-server-2017

When the expression exceeds the specified length, the string returns ** for the specified length.

我可以看到的另一个问题是: 您的 IdM 表中 JobCode 的数据类型是什么?试试这个,看看它是否返回任何结果:

SELECT JobCode FROM dbo.IdM WHERE ISNUMERIC(JobCode) = 0

【讨论】:

【解决方案3】:

答案如下:

SELECT          d.Code, a.Agency, a.Agency_job, a.OUCode, a.JobCode, d.OraUser, c.ProfileName
FROM            dbo.Agency AS a 
LEFT OUTER JOIN dbo.IdM AS d ON CAST(REPLACE(STR(a.OUCode, 3), ' ', '0') AS NVARCHAR(16)) = d.OrganizationUnitCode AND a.JobCode = d.JobCode 
LEFT OUTER JOIN dbo.Profiles AS c ON c.JobCode = a.JobCode AND c.OUCode = a.OUCode
WHERE          (d.Code IS NOT NULL)

在使用 STR 函数时也要选择正确的值。

【讨论】:

  • 我遇到了同样的错误。 STR 函数:我想要一个长度为 3 的字符串,我得到了我需要的(例如:7 --> 007)。
  • 尝试以下查询:SELECT d.Code, a.Agency, a.Agency_job, a.OUCode, a.JobCode, d.OraUser, c.ProfileName FROM dbo.Agency 作为 LEFT OUTER JOIN dbo.IdM AS d ON CAST(REPLACE(RIGHT('00'+CAST(a.OUCode AS NVARCHAR(16)), 3), ' ', '0') AS NVARCHAR(16)) = d.OrganizationUnitCode AND a .JobCode = d.JobCode LEFT OUTER JOIN dbo.Profiles AS c ON c.JobCode = a.JobCode AND c.OUCode = a.OUCode WHERE (d.Code IS NOT NULL)
猜你喜欢
  • 2020-04-17
  • 2011-08-29
  • 2015-06-20
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多