CAST连字符( - )到十进制

时间:2014-09-26 13:50:46

标签: sql sql-server casting type-conversion

我必须在SQL Server中将CAST' - '(连字符号)改为十进制(8,2)。

我正在创建一个CTE并将一些数据转储到包含一些列的表中。对于1列,我需要转储' - 'AS DECIMAL(8,2)。我将如何实现这一目标......

我正在使用

    SELECT CAST('-' AS DECIMAL(8,2)) Column1

抛出错误:将varchar转换为数据类型为数字的算术溢出错误。

“我知道上面的查询或投射无法完成”,但我需要以某种方式实现它!请帮忙

我有几个查询用于将数据转储到物理表中。除此之外,第一个查询是上面创建一个包含4列的表。在col1中我需要输入' - '符号,在其他查询中是一个十进制'列'。第二个查询是将数据插入到同一物理表中。在从这个动态创建的物理表中获取数据期间发生了一些计算。这就是原因,我需要将' - '(连字符)转换为十进制列

2 个答案:

答案 0 :(得分:7)

你的基本问题是什么?你的映射不好。

enter image description here

我们想要制作成数字的字符串。问题是-没有数字值因此,您需要对此做些什么。您的问题的问题在于,您还没有说明在错误值的情况下代码应该执行的操作。

  • 我们是否炸毁了这个过程并停止将数据存储到表中?全有或全无可能
  • 系统在处理"坏"时是否存在哨兵价值?数据。也许-1有意义。这是戈登采取的方法。
  • 我们可以在坏数据的位置使用NULL吗?
  • 我们应该不将这些行插入目标表吗?

如果你正在使用SQL Server 2012+,我们有一个TRY_CAST方法将尝试进行数据类型转换,如果不能,则该方法返回NULL。

SQL Server中内置了IsNumeric函数,但它不是100%可靠(需要引用)。将其与CASE表达式配对,这将使Gordon的答案变得一致。

否则,您需要在源查询中添加过滤器以过滤掉那些错误的行。我之前遇到了similar situation日期

答案 1 :(得分:1)

假设您想要在列中强制转换值,那么只需使用case语句来检查连字符:

SELECT (CASE WHEN col = '-' THEN CAST(0 AS DECIMAL(8,2)) 
             ELSE CAST(col as DECIMAL(8, 2))
        END) as column1;

如果开头或结尾有空格,您可能需要各种形式的修剪。