我是 SQL 中 JSON 的新手。我收到错误“JSON 文本格式不正确。在位置 0 处发现意外字符“N”。” 执行以下操作时 -
DECLARE @json1 NVARCHAR(4000)
set @json1 = N'{"name":[{"FirstName":"John","LastName":"Doe"}], "age":31, "city":"New York"}'
DECLARE @v NVARCHAR(4000)
set @v = CONCAT('N''',(SELECT value FROM OPENJSON(@json1, '$.name')),'''')
--select @v as 'v'
SELECT JSON_VALUE(@v,'$.FirstName')
Run Code Online (Sandbox Code Playgroud)
“ select @v as 'v' ”给了我
N'{"FirstName":"John","LastName":"Doe"}'
Run Code Online (Sandbox Code Playgroud)
但是,在最后一个 select 语句中使用它会给我错误。
DECLARE @v1 NVARCHAR(4000)
set @v1 = N'{"FirstName":"John","LastName":"Doe"}'
SELECT JSON_VALUE(@v1,'$.FirstName') as 'FirstName'
Run Code Online (Sandbox Code Playgroud)
也工作正常。
我们尝试在SQL Server 2016中使用FOR JSON Path从SQL查询中形成嵌套数组.
SQL查询:
SELECT A,
B.name as [child.name],
B.date as [child.date]
from Table 1 join Table 2 on Table 1.ID=Table 2.ID FOR JSON PATH
Run Code Online (Sandbox Code Playgroud)
期望的输出:
[{
A:"text",
"child:"[
{"name":"value", "date":"value"},
{"name":"value", "date":"value"}
]
}]
Run Code Online (Sandbox Code Playgroud)
但是我们得到的是:
[{
A:"text",
"child:" {"name":"value", "date":"value"}
},
{
A:"text",
"child":{"name":"value", "date":"value"}
}]
Run Code Online (Sandbox Code Playgroud)
我们如何使用FOR JSON PATH来形成嵌套的子数组.
我有一个表在一个列中存储json。我想通过合并另一个json更新json值。
就像是:
insert into mytable
values ('{ "a": "b" ')
update mytable
set jsonColumn = JSON_MERGE(jsonColumn, '{ "c": 2 }')
Run Code Online (Sandbox Code Playgroud)
这应该导致像这样的json:
{ "a": "b", "c": 2 }
Run Code Online (Sandbox Code Playgroud)
不幸的是,没有这样的JSON_MERGE功能,而JSON_MODIFY只允许我一一修改列。我有太多的东西,包括嵌套属性。
我基本上是在寻找等同于postgres || 级联运算符。
我正在尝试使用Json_Modify更新所有列的值:
DECLARE @JSON NVARCHAR(MAX)
SET @JSON =
N'{
"A":1,
"TMP": [
{"A":"VALUE1", "B": "VALUE2", "C": 1},
{"A":"VALUE3", "B": "VALUE4", "C": 2},
{"A":"VALUE5", "B": "VALUE6", "C": 3}]}
'
SET @JSON = JSON_MODIFY(@JSON, '$.TMP.A', 'JEJE')
SELECT * FROM OPENJSON(@JSON, '$.TMP') WITH ( A NCHAR(10), B NCHAR(10), C INT )
Run Code Online (Sandbox Code Playgroud)
我需要用"JEJE"更新所有列"A",例如,它不起作用.
我的表中有一个nvarchar(1000)字段,并且正在该列中存储JSON数据。
例如:
CONTENT_RULE_ID CONTENT_RULE
1 {"EntityType":"Inquiry", "Values":[1,2]}
2 {"EntityType":"Inquiry", "Values":[1,3]}
3 {"EntityType":"Inquiry", "Values":[2,4]}
4 {"EntityType":"Inquiry", "Values":[5,6,1]}
6 {"EntityType":"Inquiry", "Values":[8,1]}
8 {"EntityType":"Inquiry", "Values":[10,12,11]}
Run Code Online (Sandbox Code Playgroud)
由此我如何在sql server中使用JSON_QUERY获取所有查询ID为1的CONTENT_RULE_ID
我在将Msft Sql Server中的JSON函数啮合在一起时遇到问题。我有一个表,用于存储复杂的JSON结构,并且需要提取对象数组的子集。
例如,我制作了一个简单的脚本,该脚本创建一个表并用一些记录填充该表:
CREATE TABLE JsonData ( CompanyId int IDENTITY(1,1) NOT NULL, Name varchar(50) NOT NULL, Json varchar(max) NOT NULL)
INSERT INTO JsonData (Name, Json) VALUES ('Company A', '{"Sector":"Food/Bev","EmployeeCount":105,"Address":{"Address1":"88 Oak Ave","Address2":"","City":"Madison","State":"WI","Zip":"11223"},"Vehicles":[{"Make":"Toyota","Model":"Camry","Year":2013,"Maintenance":[{"Desc":"Oil change","PerformedOn":"2017-04-01"},{"Desc":"Oil change","PerformedOn":"2017-08-01"}]},{"Make":"Ford","Model":"F150","Year":2010,"Maintenance":[{"Desc":"Oil change","PerformedOn":"2015-01-01"}]},{"Make":"Honda","Model":"Odyssey","Year":2010,"Maintenance":[{"Desc":"Oil change","PerformedOn":"2013-01-01"},{"Desc":"Oil change","PerformedOn":"2014-01-01"}]}]}');
INSERT INTO JsonData (Name, Json) VALUES ('Company B', '{"Sector":"Plastics","EmployeeCount":853,"Address":{"Address1":"100 Main St","Address2":"","City":"Anchorage","State":"AK","Zip":"56432"},"Vehicles":[{"Make":"Ford","Model":"F150","Year":2003,"Maintenance":[{"Desc":"Oil change","PerformedOn":"2017-01-01"},{"Desc":"Tire rotation","PerformedOn":"2017-01-01"},{"Desc":"Brake inspection","PerformedOn":"2017-02-01"}]},{"Make":"Ford","Model":"F150","Year":2008,"Maintenance":[{"Desc":"Oil change","PerformedOn":"2017-01-01"}]},{"Make":"Volkswagen","Model":"Jetta","Year":2010,"Maintenance":[]}]}');
INSERT INTO JsonData (Name, Json) VALUES ('Company C', '{"Sector":"Plastics","EmployeeCount":50,"Address":{"Address1":"99 Pine St","Address2":"","City":"Dallas","State":"TX","Zip":"33443"},"Vehicles":[{"Make":"Pontiac","Model":"Fiero","Year":1998,"Maintenance":[{"Desc":"Oil change","PerformedOn":"2010-04-01"},{"Desc":"Oil change","PerformedOn":"2000-08-01"}]},{"Make":"Chevy","Model":"Silverado","Year":2008,"Maintenance":[{"Desc":"Oil change","PerformedOn":"2010-01-01"}]},{"Make":"Honda","Model":"Odyssey","Year":2014,"Maintenance":[{"Desc":"Oil change","PerformedOn":"2015-04-01"},{"Desc":"Oil change","PerformedOn":"2015-09-01"}]}]}');
Run Code Online (Sandbox Code Playgroud)
我正在尝试获取福特公司B公司车辆的清单。我的想法是获取公司B的记录,然后解析json以获取Make ='Ford'的Vehicles数组。该脚本有效,但是确实很笨拙。
在我看来,这应该全部汇总为一个声明。
DECLARE @vehicJson varchar(max);
SELECT @vehicJson = '{ "Vehicles": ' …Run Code Online (Sandbox Code Playgroud) 我有以下 JSON。
[
{
"attributes": {
"2003": "Some text",
"2004": 0,
"2006": 0,
"2008": 0,
"2011": 0,
"2120": 0
},
"path": "/Path1",
"changeDate": "2019-11-11T13:56:37.987Z",
"guid": "00000000-0000-0000-0000-000000000000",
"version": 0,
"timestamp": "2019-11-11T14:21:14.86427Z"
},
{
"attributes": {
"2121": 0,
"2297": 0,
"2298": 0,
"2299": 0,
"2805": 0,
"8501": 0,
"12004": 0,
"13266": 0,
"13282": 0
},
"path": "P:/Path2/SubPath",
"changeDate": "2019-11-11T13:55:35.943Z",
"guid": "705b30ab-53b0-42ee-bb98-6d80daae2e18",
"version": 1,
"timestamp": "2019-11-11T09:08:54.417Z"
},
{
"attributes": {},
"path": "PP:/OneMorePath",
"changeDate": "2019-11-11T14:20:49.5Z",
"guid": "b9aac8f3-1f2a-4b52-b8d8-af6b654d3f0f",
"version": 41,
"timestamp": "2019-11-11T13:26:24.723Z"
}
]
Run Code Online (Sandbox Code Playgroud)
为此,我有两个 …
我有类似于下面的表,其中有一对多映射
DECLARE @T1 TABLE(RootId int, [Name] varchar(50))
DECLARE @T2 TABLE(Id int,RootId int, Category varchar(50))
INSERT INTO @T1
VALUES(1,'Some Name 12121'),(2,'Some Name 343434')
INSERT INTO @T2
VALUES(100,1,'Category 3333'),
(101,1,'Category 2222'),
(102,1,'Category 4444'),
(103,1,'Category 5555'),
(104,2,'Category 1111'),
(105,2,'Category 77777')
Run Code Online (Sandbox Code Playgroud)
我期望编写查询,以便它生成如下格式的 json,其中包含项目和子数组
[
{
"item": {
"rootId": 1,
"name": "Some Name 12121",
"sub": [
{
"id": 100,
"category": "Category 3333"
},
{
"id": 101,
"category": "Category 2222"
}
]
}
}
]
Run Code Online (Sandbox Code Playgroud)
我已经尝试过以下但无法达到预期的输出
SELECT T1.RootId,T1.Name,T2.Id AS [Sub.Id],T2.Category as [Sub.Category]
FROM @T1 T1
INNER …Run Code Online (Sandbox Code Playgroud) 我在其中一列中有一个包含 JSON 数据的表,我正在尝试解析 JSON 数据并插入到临时表中
DECLARE @TEMPTABLE
(
ID INT,
Status NVARCHAR(50),
Cost DECIMAL(20, 0)
)
INSERT INTO @TEMPTABLE
SELECT
ID,
JSON_VALUE(mydata, '$.Status') AS Status,
JSON_VALUE(mydata, '$.Cost') AS Cost
FROM Expense
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
将数据类型 nvarchar 转换为数字时出错
如果我注释掉该Cost列,同样可以正常工作。
成本表中的示例 JSON 数据
| ID | mydata
+----+-------------------------------------
| 1 | {"Status":"Shipped","Cost":"$10.50"}
Run Code Online (Sandbox Code Playgroud) 我有一个包含 JSON 的文本字符串,如下所示:
'{ "d" : [ "test0", "test1", "test2" ] }'
Run Code Online (Sandbox Code Playgroud)
我想以行的形式检索数组的项目。
+------------+
| data |
+------------+
| test0 |
| test1 |
| test2 |
+------------+
Run Code Online (Sandbox Code Playgroud)
网络上的所有示例都展示了如何使用“对象数组”完成它,但我想用一个简单的“字符串数组” MS 示例来完成。
默认查询
+------------+
| data |
+------------+
| test0 |
| test1 |
| test2 |
+------------+
Run Code Online (Sandbox Code Playgroud)
只返回一个表,其中包含每个条目的键、值、类型
+-----+-------+------+
| key | value | type |
+-----+-------+------+
| 0 | test0 | 1 |
| 1 | test1 | 1 |
| 2 | test2 | 1 |
+-----+-------+------+ …Run Code Online (Sandbox Code Playgroud) 我的数据库中有一个简单的查询:
SELECT id, name FROM users FOR JSON AUTO, ROOT('users')
Run Code Online (Sandbox Code Playgroud)
这将返回以下JSON:
{
"users": [
{"id": "1", "name": "John"}
{"id": "2", "name": "Mike"}
]
}
Run Code Online (Sandbox Code Playgroud)
我想使用以下格式返回:
{
"users": {
"list": [
{"id": "1", "name": "John"}
{"id": "2", "name": "Mike"}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在SQL级别上通过简单地更改查询来做到这一点吗?