【问题标题】:Conversion failure varchar to int on a column cast as int在转换为 int 的列上将 varchar 转换为 int 失败
【发布时间】:2017-06-19 16:09:47
【问题描述】:

我创建了一个名为 vReceivedEmail 的视图,其中包含一个名为 RowPrimaryKeyValue 的 varchar 列。此列通常存储主键 id 值,例如 567781,但不时有描述性文本“Ad hoc message”。

我已将视图设置为仅显示包含主键值的记录,然后将 CAST 列显示为 int。

SELECT      CAST(Email.RowPrimaryKeyValue as int)           as DetailID
FROM        MessageStore.dbo.Email Email
WHERE       ISNUMERIC(Email.RowPrimaryKeyValue) = 1

当我测试视图时,我只得到具有我期望的主键值的记录,当我在对象资源管理器中查看视图的列列表时,该列保存为int 数据类型。

然后我尝试在单独的查询中应用以下 WHERE 子句,引用我保存的视图:

SELECT      PotAcc.DetailID
FROM        PotentialAccounts PotAcc
WHERE       PotAcc.DetailID NOT IN (
                SELECT      RecEmail.DetailID
                FROM        vReceivedEmail  RecEmail
            )

...但我返回以下错误:

转换 varchar 值 'Ad hoc message' 时转换失败 数据类型为 int。

'Ad hoc message' 是来自我过滤并转换为 int 的列中的数据,但我不知道它是如何解决这个问题的,因为视图会明确地将其过滤掉并将列转换为 int。

【问题讨论】:

    标签: tsql sql-server-2012 ssms-2012


    【解决方案1】:

    既然您使用的是 SQL Server 2012,那么使用 try_convert(int,RowPrimaryKeyValue) is not null 而不是 isnumeric() 怎么样?

    你的视图应该是这样的:

    select try_convert(int, RowPrimaryKeyValue) as DetailID
    from MessageStore.dbo.Email Email
    where try_convert(int, RowPrimaryKeyValue) is not null
    

    在 SQL Server 2012 及更高版本中:当转换失败而不是错误时,每个都将返回 null。

    【讨论】:

    • 不错。之前没用过try_convert,所以今天学到了新东西。非常感谢。
    • 版本不错
    【解决方案2】:

    Isnumeric() 可能是骗人的...但是我敢打赌这是由于 SQL Server 优化造成的。尽管您的观点有效,但这并不意味着外部查询保证只返回 INT 。而不是使用视图...使用CTE 并尝试一下。而且由于您是 2012 年,因此可以避免上述 SqlZim 的解释。

    WITH CTE AS(
    SELECT      CAST(Email.RowPrimaryKeyValue as int)           as DetailID
    FROM        MessageStore.dbo.Email Email
    WHERE       ISNUMERIC(Email.RowPrimaryKeyValue) = 1)
    
    
    SELECT      PotAcc.DetailID
    FROM        PotentialAccounts PotAcc
    WHERE       PotAcc.DetailID NOT IN (
                    SELECT      RecEmail.DetailID
                    FROM        CTE RecEmail
                )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 2011-12-01
      相关资源
      最近更新 更多