【问题标题】:Understanding SQL throwing Conversion errors了解 SQL 引发的转换错误
【发布时间】:2019-10-04 15:23:11
【问题描述】:

我有一个 SQL Server 代理作业,它偶尔会失败,将转换错误 varchar 抛出到 int。

最疯狂的部分是在抛出错误之后我运行相同的代码,它运行正常。

然后,如果再次重新运行该作业,它运行良好。然而,几天后,这种情况再次发生(该作业计划每天运行)。拜托,有人可以帮我理解为什么会发生这种情况以及如何解决吗?

我正在使用 SQL Server 2017 数据类型:Col1 = char(6),Col2 = varchar(25),Col3 = char(15),col4 = char(6),lev1 = char(6)

SELECT 
    col1, col2,
    REPLACE(col3,'_','') AS col3
FROM 
    TableName
WHERE 
    col4 IN (SELECT DISTINCT lev1 
             FROM viewName WITH (NOLOCK))

UNION ALL

SELECT 
    0, 'Unassigned', 0

【问题讨论】:

  • 将代码添加到您知道失败的部分的问题中。即使您手动运行它也能正常工作,但对我们来说,工作总比无所事事要多。
  • 我发布了没有实际表名和列的代码。我希望这会有所帮助。
  • 列定义在这里非常相关;请提供他们
  • col4 的数据类型呢?也许将 col4 与 lev1 进行比较是问题所在。 where convert(char(6),col4) in (select distinct lev1 ....
  • 直到您掌握了基本的 tsql、stop using hints generally 和专门的 nolock 提示。在您了解可能的后果并准备相应地处理它们之前,请勿使用 nolock 提示。

标签: sql-server sql-job


【解决方案1】:

col1col3 被定义为字符数据类型,但在联合的第二个选择中,您有硬编码的整数。尝试制作这些字符串。

SELECT 
    col1, col2,
    REPLACE(col3,'_','') AS col3
FROM 
    TableName
WHERE 
    col4 IN (SELECT DISTINCT lev1 
             FROM viewName WITH (NOLOCK))

UNION ALL

SELECT 
    '0', 'Unassigned', '0'

【讨论】:

  • 很可能,我会试试的。谢谢。
  • 但是,你知道为什么有时如果失败有时又不会吗?我正在努力理解它背后的理论,拜托。
  • @Senay 我的 猜测 有时 col1col3 在第一个查询中只返回数值,并且它们被隐式转换为 INT 以匹配硬编码第二个查询中的数据。在其他时候,这些列返回其他字符,并且隐式转换失败。通过在第二个查询字符串中生成值,数据类型将匹配,并且将消除到 INT 的隐式转换。
  • 非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
相关资源
最近更新 更多