背景:
我有一个nvarchar(max)名为'questions' 的JSON 列,它看起来像是一行中的这个真实例子......
{"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":"1","221":"1","222":"1","223":"1","224":"1","225":"1","226":"1","227":"1","228":"1","229":"1","230":"1","231":"1","232":"1"}
Run Code Online (Sandbox Code Playgroud)
我正在为示例'call'生成此示例JSON代码段...
[
{
"call": {
"id": 200643,
"yes_answers": [
{
"question_id": "220"
},
{
"question_id": "221"
},
{
"question_id": "222"
},
{
"question_id": "223"
},
{
"question_id": "224"
},
{
"question_id": "225"
},
{
"question_id": "226"
},
{
"question_id": "227"
},
{
"question_id": "228"
},
{
"question_id": "229"
},
{
"question_id": "230"
},
{
"question_id": "231"
},
{
"question_id": "232"
}
]
}
}
]
Run Code Online (Sandbox Code Playgroud)
..使用此查询...
select c.call_id as [call.id],
(
select x.[key] …Run Code Online (Sandbox Code Playgroud) 我在SQL Server中创建嵌套JSON时遇到问题。我正在尝试创建如下所示的输出:
[
{
"websiteURL": "www.test.edu",
"email": "hello@test.edu",
"phone": 123456798,
"address": {
"address1": "1 Oak Grove",
"address2": "London",
"address3": "UK"
},
"accreditations": [
{
"name": "Indicator1",
"value": "True"
},
{
"name": "Indicator2",
"value": "False"
},
{
"name": "Indicator3",
"value": "False"
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
我已经尝试了FOR JSON AUTO和FOR JSON PATH:
SELECT
d.SCHOOL_WEBSITE AS websiteURL
,d.SCHOOL_EMAIL AS email
,d.SCHOOL_TELEPHONE AS phone
,d.[Address 1] AS 'address.address1'
,d.[Address 2] AS 'address.address2'
,d.[Address 3] AS 'address.address3'
,accreditations.[IndiUID] as name
,accreditations.Value as value
FROM [TESTDB].[dbo].[DataValues] as …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用“for json path”语句在复杂且嵌套的 JSON 字符串中生成大量数据,并且我使用多个函数来创建此 JSON 字符串的不同部分,如下所示:
declare @queue nvarchar(max)
select @queue = (
select x.ID as layoutID
, l.Title as layoutName
, JSON_QUERY(queue_objects (@productID, x.ID)) as [objects]
from Layouts x
inner join LayoutLanguages l on l.LayoutID = x.ID
where x.ID = @layoutid
group by x.ID, l.Title
for json path
)
select @queue as JSON
Run Code Online (Sandbox Code Playgroud)
到目前为止,JSON 将是:
{
"root": [{
"layouts": [{
"layoutID": 5
, "layoutName": "foo"
, "objects": []
}]
}]
}
Run Code Online (Sandbox Code Playgroud)
然后将调用“queue_objects”函数来填充“objects”数组:
select 0 as objectID
, …Run Code Online (Sandbox Code Playgroud) 我正在 SQL Server 2016 中的 SSMS 中使用 JSON。有什么办法可以解决 FOR JSON 语句的结果显示为 XML 列的问题?
是否有任何设置更改、附加组件、外部工具等,甚至是 hack 来减轻痛苦?
在我的理想世界中,单击 JSON 列(或 XML 列)将在我选择的文本编辑器中打开,例如 Visual Studio Code,SSMS 知道列中的字符串是 JSON 并将其保存到文件带有 .json 扩展名。
我正在尝试展平由 构造的对象数组FOR JSON。
我的查询如下所示:
select
(
select id from MyTable
where id in (select value from OPENJSON(@jsonArray))
FOR JSON PATH
) existing,
(
select value id from OPENJSON(@jsonArray)
where value not in (select Id from MyTable)
FOR JSON PATH
) missing
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
Run Code Online (Sandbox Code Playgroud)
生成的 JSON 为:
{
"existing": [
{
"id": "a00cd8f6-d1c6-4604-b235-59d3cacd5bcc"
},
{
"id": "052455b6-6bf5-47d3-8bee-7ba98d7fbd50"
}
],
"missing": [
{
"id": "328add2d-e8f2-4a0e-af54-5b1733310170"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想要的是:
{
"existing": [
{
"id": "a00cd8f6-d1c6-4604-b235-59d3cacd5bcc"
},
{
"id": …Run Code Online (Sandbox Code Playgroud) 我的数据看起来像:
客户表
CustomerId CustomerName CustomerEmail
------------------------------------------
1 Ben Ben@gmail.com
2 Robert Robert@gmail.com
3 Paul Paul@gmail.com
Run Code Online (Sandbox Code Playgroud)
客户联系人表
CustomerContactId CustomerId ContactName ContactEmail
----------------------------------------------------------
99 1 Lisa Lisa@msn.com
98 3 Jane Jane@msn.com
97 3 Wendy Wendy@msn.com
Run Code Online (Sandbox Code Playgroud)
这是我正在寻找的结果:
[
{
"CustomerId": 1,
"Names": [ "Ben","Lisa" ],
"Emails": [ "Ben@gmail.com","Lisa@msn.com" ]
},
{
"CustomerId": 2,
"Names": [ "Robert" ],
"Emails": [ "Robert@gmail.com" ]
},
{
"CustomerId": 3,
"Names": [ "Paul","Jane","Wendy" ],
"Emails": [ "Paul@gmail.com","Jane@msn.com","Wendy@msn.com" ]
}
]
Run Code Online (Sandbox Code Playgroud)
我尝试过的: 我很尴尬地说我还没有接近:
CustomerId CustomerName CustomerEmail
------------------------------------------ …Run Code Online (Sandbox Code Playgroud) 我正在使用 SQL Server Standard(64 位)14.0.1000.169 在 QA 服务器上使用屏蔽数据库。这是我的结构:
CREATE TABLE [dbo].[Test](
[Column1] [VARCHAR(64)] NULL,
[Column2] [VARCHAR(64)] NULL
)
GO
INSERT INTO [dbo].[Test]
VALUES ('ABCDEFG', 'HIJKLMN')
Run Code Online (Sandbox Code Playgroud)
我用以下代码屏蔽了该列:
ALTER TABLE [dbo].[Test]
ALTER COLUMN [Column1] VARCHAR(64) MASKED WITH (FUNCTION = 'default()');
Run Code Online (Sandbox Code Playgroud)
当我使用非允许的用户执行以下查询时,它按预期工作:
SELECT [Column1], [Column2]
FROM [dbo].[Test]
FOR JSON PATH
-- RESULT: '[{"Column1":"xxxx", "Column2":"HIJKLMN"}]'
Run Code Online (Sandbox Code Playgroud)
但当同一个非允许用户将结果保存在变量中时(主要目标),它不起作用:
DECLARE @var VARCHAR(64)
SET @var = (SELECT [Column1], [Column2] FROM [dbo].[Test] FOR JSON PATH)
SELECT @var --it should show a valid JSON...
-- RESULT: 'xxxx' <-- JSON LOSES …Run Code Online (Sandbox Code Playgroud)