首页 > 解决方案 > SQL Server:将数据类型 nvarchar 转换为十进制时出错

问题描述

以下代码将打开一条 JSON 消息,并在post_metric_score表上的 JSON 消息中插入与“$.disgust”字段对应的值。它通常工作正常,除非值是这样的:

"disgust": 5.6780936574796215e-05. 

我得到的错误是

将数据类型 nvarchar 转换为十进制时出错

INSERT INTO [Database].[post_metric_score] ([post_id], [metric_id], [score])
    SELECT @post_id, 4, [score]
    FROM OPENJSON(@postJson, '$.sentiment_results.emotions')
         WITH ([score] DECIMAL(12, 8) '$.disgust') 

我试图在 SELECT 语句中添加一个转换语句,但它不起作用,例如

SELECT @post_id, 6, CONVERT(DECIMAL(12,8), [score]) AS [score] 

关于我做错了什么的任何想法?

标签: sqljsonsql-server

解决方案


尝试将值作为字符串检索并使用try_convert()

INSERT INTO [Database].[post_metric_score]([post_id], [metric_id], [score])
    SELECT @post_id, 4, try_convert(decimal(12, 8), try_convert(float, [score]))
    FROM OPENJSON(@postJson, '$.sentiment_results.emotions')
        WITH ([score] VARCHAR(255) '$.disgust') ;

或者直接使用浮点数:

INSERT INTO [Database].[post_metric_score]([post_id], [metric_id], [score])
    SELECT @post_id, 4, try_convert(decimal(12, 8), try_convert(float, [score]))
    FROM OPENJSON(@postJson, '$.sentiment_results.emotions')
        WITH ([score] float '$.disgust') ;

推荐阅读