MSSQL Server 2008 - 将Nvarchar转换为数字

时间:2017-11-15 14:04:10

标签: sql sql-server sql-server-2008 casting

即时使用mssql 2008,我永远无法将nvarchar转换为数值。

你能告诉我吗?我在www上找到了不同的解决方案,但是所有这些解决方案都失败并显示错误消息:

  

Msg 8114,Level 16,State 5,Line 15转换数据类型时出错   nvarchar为数字。

我已经为演示目的构建了一个简化示例:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "locations",
            "query": {
              "bool": {
                "should": [
                  {
                    "bool": {
                      "must": [
                        {
                          "terms": {
                            "locations.id": [
                              "UA",
                              "RU"
                            ]
                          }
                        },
                        {
                          "term": {
                            "locations.type": "country"
                          }
                        }
                      ]
                    }
                  },
                  {
                    "bool": {
                      "must": [
                        {
                          "terms": {
                            "locations.id": [
                              "EU",
                              "OC"
                            ]
                          }
                        },
                        {
                          "term": {
                            "locations.type": "continent"
                          }
                        }
                      ]
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

3 个答案:

答案 0 :(得分:1)

我发现了一个强烈的提示,哪些是错的...这个问题似乎与SQL服务器期望的分隔符有关。

如果您将以下行更改为:

insert into #temptable values ('0.5','0')

其工作

答案 1 :(得分:0)

问题是您使用的ISNUMERIC(col1) = 1ISNUMERIC('1e4')ISNUMERIC('$')或您的案例ISNUMERIC('1,000,000')等大量案例中失败了。不要以这种方式使用ISNUMERIC

相反,试试这个......

 UPDATE #temptable
 SET col2 = CAST(col1 AS numeric(10,5))
 WHERE col1 not like '%[^0-9.]%'

答案 2 :(得分:0)

在SQL Server 2012 +中使用try_convert()

UPDATE #temptable
   SET col2 = TRY_CONVERT(numeric(10,5), col1)
   WHERE ISNUMERIC(col1) = 1;

SQL Server在查询中重新排列表达式评估。因此,CAST()可能会在WHERE之前实施 - 从而导致错误。您可以对查询的SELECT版本进行类似的更改。

在SQL Server 2008中,您应该能够使用CASE

有效地执行相同的操作
UPDATE #temptable
   SET col2 = (CASE WHEN ISNUMERIC(col1) = 1 THEN CONVERT(numeric(10, 5), col1) END)
   WHERE ISNUMERIC(col1) = 1;

注意:可能存在ISNUMERIC()返回“1”的情况,但无法转换该值(例如,溢出)。在这种情况下,这个版本仍然会失败。