Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在select into期间更改json_值的数据类型,以便我可以对列求和_Sql_Json_Sql Server_Tsql - Fatal编程技术网

Sql 在select into期间更改json_值的数据类型,以便我可以对列求和

Sql 在select into期间更改json_值的数据类型,以便我可以对列求和,sql,json,sql-server,tsql,Sql,Json,Sql Server,Tsql,我在表中有一列是json。它包含多个列 例如: 第1行:“sTCounts”:[{“dpsTypeTest”:“TESTTRIAL”,“cnt”:3033244.0} 第2行:“sTCounts”:[{“dpsTypeTest”:“TESTTRIAL”,“cnt”:3.3} 我需要对表中所有行的cnt值求和 我对存储过程不太熟悉,无法掌握。我认为最简单的方法是创建一个临时表,将值提取到列中,然后编写一个查询来求和列值 问题是它创建了一个数据类型为nvarchar(4000)的列。它不允许我对

我在表中有一列是json。它包含多个列

例如:

  • 第1行:
    “sTCounts”:[{“dpsTypeTest”:“TESTTRIAL”,“cnt”:3033244.0}
  • 第2行:
    “sTCounts”:[{“dpsTypeTest”:“TESTTRIAL”,“cnt”:3.3}
我需要对表中所有行的cnt值求和

我对存储过程不太熟悉,无法掌握。我认为最简单的方法是创建一个临时表,将值提取到列中,然后编写一个查询来求和列值

问题是它创建了一个数据类型为
nvarchar(4000)
的列。它不允许我对该列求和。我曾想过更改数据类型,但不确定如何更改。我正在尝试
CAST
,但运气不好

 select CAST(json AS varchar) AS JSON_VALUE(jsontext, 
'$.sTCounts.cnt') AS PerfCount, TitleNumber 
INTO dbo_Testing_Count0
from PerformanceTest

select sum(PerfCount)
from dbo_Testing_Count
Group by PerfCount
错误消息是:

“jsontext”附近的语法不正确


有什么想法吗?我愿意接受另一种方法来对列求和或更改数据类型,只要专家能够提供帮助。我很感激。

您在问题中提供的JSON无效……这似乎只是一个更大的JSON的片段。因为您的数据以
[
您必须将其视为一个数组,因此简单的json路径
'$.serviceTierCounts.cnt'
可能无法工作

试试这个,我在结尾添加了开头的{和结尾的括号:

DECLARE @mockupTable TABLE(ID INT IDENTITY, YourJson NVARCHAR(MAX));
INSERT INTO @mockupTable VALUES
 (N'{"serviceTierCounts":[{"dpsType":"TRIAL","cnt":3033244.0}]}')
,(N'{"serviceTierCounts":[{"dpsType":"TRIAL","cnt":3.3}]}');
--您可以使用强制转换直接使用
JSON\u value
读取一个标量值。但在这种情况下,我需要添加
[0]
。这将告诉引擎读取第一个(基于零的索引!)对象的
cnt
属性

SELECT CAST(JSON_VALUE(YourJson,'$.serviceTierCounts[0].cnt') AS DECIMAL(14,4))
FROM @mockupTable 
--但我认为,这就是你想要的:

SELECT *
FROM @mockupTable 
CROSS APPLY OPENJSON(YourJson,'$.serviceTierCounts')
WITH(dpsType varchar(100)
    ,cnt decimal(14,4));
WITH
子句将在键入的列中并排返回对象


为了便于继续,您可以将其包装为CTE,并在以下选择中继续设置。

错误位于
JSONTEXT
,而不是您的
SUM
。您将
强制转换(json为varchar)为json_值(JSONTEXT,'$.serviceTierCounts.cnt')作为PerformanceCount,
这没有什么意义。看起来您忘记了第一个
后面的别名为
。此外,永远不要声明
varchar
,也不要声明它的长度。另外,如果
“$.serviceTierCounts.cnt”
返回一个整数值,请在
中选择
或使用
转换
OPENJSON
使用
with
来定义JSON数据的结构。谢谢。我会处理这些,如果我弄明白了,请为其他人发帖。谢谢