即时使用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"
}
}
]
}
}
]
}
}
}
}
]
}
}
}
答案 0 :(得分:1)
我发现了一个强烈的提示,哪些是错的...这个问题似乎与SQL服务器期望的分隔符有关。
如果您将以下行更改为:
insert into #temptable values ('0.5','0')
其工作
答案 1 :(得分:0)
问题是您使用的ISNUMERIC(col1) = 1
在ISNUMERIC('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”的情况,但无法转换该值(例如,溢出)。在这种情况下,这个版本仍然会失败。