【问题标题】:Error Converting Varchar To Numeric Within Case在大小写内将 Varchar 转换为数值时出错
【发布时间】:2013-01-02 10:59:19
【问题描述】:

我有一个存储过程,它使用一系列临时表来提取数据、格式化然后插入到新表中。我知道这没有意义,但我正在尝试将 null 格式化为“”(空白)或“-”破折号。这是公元前。零值实际上代表了实际余额。当我这样做时,我不断收到将 varchar 转换为数字的错误。

CASE 
WHEN ##TEMPTABLE.[Summary Category Definition] = 'In Storage' THEN '' 
WHEN ##TEMPTABLE.[L/C Amount] > 0 THEN ##TEMPTABLE.[L/C Amount] 
ELSE ''
END AS [L/C Amount]

我试过了:

CASE 
WHEN ##TEMPTABLE.[Summary Category Definition] = 'In Storage' THEN '' 
WHEN ##TEMPTABLE.[L/C Amount] > 0 THEN convert(varchar(20), ##TEMPTABLE.[L/C Amount]    )
ELSE ''
END AS [L/C Amount]

这甚至可能吗? 感谢您的帮助。

【问题讨论】:

  • post整个sql语句,不仅如此
  • 您可以在转换前使用IsNumeric() 尝试确定字符串是否包含有效数字。请注意,它有些乐观。 (奇怪的是,标题中的转换似乎与所示 SQL 中的相反。)
  • 你的列[L/C Amount]是什么数据类型?

标签: sql-server tsql sql-server-2005 stored-procedures


【解决方案1】:

我不明白为什么您的查询不应该工作,除非[L/C Amount] 列实际上已经是VARCHAR。在这种情况下,您应该为此更改您的声明:

CASE 
    WHEN ##TEMPTABLE.[Summary Category Definition] = 'In Storage' 
        THEN '' 
    WHEN ##TEMPTABLE.[L/C Amount] <> '0' 
        THEN CONVERT(VARCHAR(20), ##TEMPTABLE.[L/C Amount]) -- why is this necessary?
    ELSE '' 
END AS [L/C Amount]

【讨论】:

  • 整个 SQL 语句是巨大的 l/c 数量实际上是在一个临时表中然后加载到一个全局临时表中。然后将该全局临时表加载到物理表中,但前提是数据被相应地格式化。可能全局临时表中的字段已经是 varchar。如果它已经是 varchar 我应该如何更改语句?我正在添加转换以尝试修复错误,我应该将其更改为数字吗?
  • @user1991167 如果它已经是varchar,那么您应该尝试我在答案中发布的代码
猜你喜欢
  • 2021-10-02
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
相关资源
最近更新 更多