标签: for-json

对于JSON路径格式

背景:

我有一个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)

t-sql sql-server json for-json

8
推荐指数
1
解决办法
231
查看次数

FOR JSON PATH与FOR JSON AUTO SQL Server

我在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)

sql-server json for-json

7
推荐指数
1
解决办法
1669
查看次数

SQL Server - “for json path”语句返回的 JSON 字符串不超过 2984 行

我正在尝试使用“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 json sql-server-2016 json-query for-json

7
推荐指数
1
解决办法
1万
查看次数

SQL Server 2016 SSMS Json 格式

我正在 SQL Server 2016 中的 SSMS 中使用 JSON。有什么办法可以解决 FOR JSON 语句的结果显示为 XML 列的问题?

是否有任何设置更改、附加组件、外部工具等,甚至是 hack 来减轻痛苦?

在我的理想世界中,单击 JSON 列(或 XML 列)将在我选择的文本编辑器中打开,例如 Visual Studio Code,SSMS 知道列中的字符串是 JSON 并将其保存到文件带有 .json 扩展名。

sql-server json ssms sql-server-2016 for-json

6
推荐指数
1
解决办法
2489
查看次数

使用 FOR 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)

sql t-sql sql-server json for-json

5
推荐指数
1
解决办法
4423
查看次数

如何使用数组聚合、Join 或 Union 成平面 Json 对象?

我的数据看起来像:

客户表

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 t-sql azure-sql-server sql-server-2017 for-json

3
推荐指数
1
解决办法
1252
查看次数

带有“FOR JSON PATH”子句的 SQL Server 数据屏蔽错误

我正在使用 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)

t-sql sql-server for-xml-path for-json dynamic-data-masking

1
推荐指数
1
解决办法
368
查看次数