标签: open-json

SQL Server OPENJSON读取嵌套的json

我想在SQL Server 2016中解析一些json.有一个Projects-> Structures-> Properties的层次结构.我想编写一个解析整个层次结构的查询,但我不想按索引号指定任何元素,即我不想做这样的事情:

openjson (@json, '$[0]')
Run Code Online (Sandbox Code Playgroud)

要么

openjson (@json, '$.structures[0]')
Run Code Online (Sandbox Code Playgroud)

我有这个想法,我可以读取顶级项目对象的值以及表示它下面的结构的json字符串,然后可以单独解析.问题是以下代码不起作用:

declare @json nvarchar(max)
set @json = '
[
   {
      "IdProject":"97A76363-095D-4FAB-940E-9ED2722DBC47",
      "Name":"Test Project",
      "structures":[
         {
            "IdStructure":"CB0466F9-662F-412B-956A-7D164B5D358F",
            "IdProject":"97A76363-095D-4FAB-940E-9ED2722DBC47",
            "Name":"Test Structure",
            "BaseStructure":"Base Structure",
            "DatabaseSchema":"dbo",
            "properties":[
               {
                  "IdProperty":"618DC40B-4D04-4BF8-B1E6-12E13DDE86F4",
                  "IdStructure":"CB0466F9-662F-412B-956A-7D164B5D358F",
                  "Name":"Test Property 2",
                  "DataType":1,
                  "Precision":0,
                  "Scale":0,
                  "IsNullable":false,
                  "ObjectName":"Test Object",
                  "DefaultType":1,
                  "DefaultValue":""
               },
               {
                  "IdProperty":"FFF433EC-0BB5-41CD-8A71-B5F09B97C5FC",
                  "IdStructure":"CB0466F9-662F-412B-956A-7D164B5D358F",
                  "Name":"Test Property 1",
                  "DataType":1,
                  "Precision":0,
                  "Scale":0,
                  "IsNullable":false,
                  "ObjectName":"Test Object",
                  "DefaultType":1,
                  "DefaultValue":""
               }
            ]
         }
      ]
   }
]';

select IdProject, Name, structures
from   openjson (@json)
with
(
    IdProject …
Run Code Online (Sandbox Code Playgroud)

parsing json hierarchy sql-server-2016 open-json

28
推荐指数
3
解决办法
3万
查看次数

SQL Server 无效版本:15 (Microsoft.SqlServer.Smo)

上下文:我在修改 SQL Server 2016 中的存储过程时遇到困难。该存储过程执行文件中 json 数据的解析。出于某种原因,我能够执行存储过程并成功执行,但是当我尝试修改存储过程时,我收到以下消息:

在此处输入图片说明

问题:有人有任何故障排除提示吗?下面是存储过程的内容。SQL Server 2016 支持使用的各种函数,包括 OPENJSON 函数。

USE mattermark_sandbox
GO

CREATE PROCEDURE get_company_data 

AS

IF OBJECT_ID('tempdb..##jsondump') IS NOT NULL DROP TABLE ##jsondump
IF OBJECT_ID('tempdb..##jsonparsed') IS NOT NULL DROP TABLE ##jsonparsed
IF OBJECT_ID('tempdb..##json_loop') IS NOT NULL DROP TABLE ##json_loop

CREATE TABLE ##jsondump (
    [my_json] [nvarchar](max) NULL
) 

-- Create a table to house the parsed content
CREATE TABLE ##jsonparsed (
    [id] [int] NULL,
    [url] [varchar](255) NULL,
    [company_name] [varchar](255) NULL,
    [domain] [varchar](255) NULL
) …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server open-json

25
推荐指数
2
解决办法
4万
查看次数

我正在尝试直接连接到 abfss(无需安装到 DBFS)并尝试使用 databricks 中的 open() 打开 json 文件

我正在尝试直接连接到 abfss(无需安装到 DBFS)并尝试使用 databricks 中的 open() 方法打开 json 文件。

json_file = open("abfss://@.dfs.core.windows.net/test.json') databricks 无法打开 azure blob 容器中存在的文件并出现以下错误:FileNotFoundError: [Errno 2] No such file 或目录:'abfss://@.dfs.core.windows.net/test.json'

我已经使用服务主体完成了所有配置设置。请建议使用 abfss 直接路径打开文件的其他方式。

azure pyspark azure-blob-storage open-json azure-databricks

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

如何设置嵌套数组的 OPENJSON 路径

我正在尝试为嵌套数组设置 OPENJSON 函数的路径,但它不起作用。尝试了我在网上找到的不同变体和示例/资源,但仍然无法弄清楚。

有任何想法吗?

编辑:

需要明确的是,我知道如何使用 CROSSAPPLY 和其他方法来做到这一点。我的问题是如何在可能的情况下使用 OPENJSON 函数的路径参数来具体执行此操作。

这是我的代码:

DECLARE @json NVARCHAR(MAX);
SET @json = '
{
    "orders": [
        {
            "id":"1",
            "date":"7/4/2020",
            "orderlines": [
                {"id": "1", "amount": 100}, 
                {"id": "2", "amount": 200}
            ]
        },
        {
            "id":"2",
            "date":"7/4/2020",
            "orderlines": [
                {"id": "3", "amount": 300}, 
                {"id": "4", "amount": 400}
            ]
        }
    ]
}
'
-- None of these return results. How do I specify the path to the "orderlines" array?
SELECT * FROM OPENJSON(@json,'$.orderlines');
SELECT * FROM OPENJSON(@json,'$.orderlines[1]');
SELECT * …
Run Code Online (Sandbox Code Playgroud)

sql sql-server arrays json open-json

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

Azure Synapse 中的 OPENJSON 排序规则导致排序规则冲突错误

我有一个 OPENJSON 命令,它接受解析的 JSON 并将其 LEFT 连接到现有表上。

当我添加 LEFT JOIN 时,出现错误:

“Latin1_General_BIN2”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突

该表的所有字符串列具有相同的排序规则: SQL_Latin1_General_CP1_CI_AS

我尝试在 LEFT JOIN 中添加 COLLATE DATABASE_DEFAULT,但没有任何改进。

我正在使用的查询大致如下:

DECLARE @json NVARCHAR(MAX) = '
{
    "ExampleJson": {
        "stuff": [
            {
                "_program_id": "hello",
                "work_date": "2021-03-23 00:00:00"
            }
        ]
    }
}';

SELECT *
FROM 
OPENJSON
(
    (
        @json
    ), '$.ExampleJson.stuff'
) 
 
WITH ( 
     [program_id] NVARCHAR(255) '$."program_id"'
     ,[work_date] DATETIME '$."work_date"'
) [json_data] 
  
 
LEFT JOIN 
    [existing_db_data]
    ON [existing_db_data].[program_id] = [json_data].[program_id] 
Run Code Online (Sandbox Code Playgroud)

open-json azure-synapse

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

如何在多行上使用 OPENJSON

我有一个包含多行的临时表,每一行都有一个名为Categories;的列。它包含一个非常简单的 json 数组,ids用于不同表中的类别。

临时表的几个示例行:

Id                                      Name    Categories
---------------------------------------------------------------------------------------------
'539f7e28-143e-41bb-8814-a7b93b846007'  Test 1  ["category1Id", "category2Id", "category3Id"]
'f29e2ecf-6e37-4aa9-aa56-4a351d298bfc'  Test 2  ["category1Id", "category2Id"]
'34e41a0a-ad92-4cd7-bf5c-8df6bfd6ed5c'  Test 3  NULL
Run Code Online (Sandbox Code Playgroud)

现在我想做的是从临时表中的所有行中选择所有类别 ID。

我所拥有的是以下内容,它不起作用,因为它给了我以下错误:

子查询返回了 1 个以上的值。当子查询跟随 =、!=、<、<=、>、>= 或当子查询用作表达式时,这是不允许的。

SELECT
     c.Id
    ,c.[Name]
    ,c.Color
FROM
    dbo.Category as c
WHERE
    c.Id in (SELECT [value] FROM OPENJSON((SELECT Categories FROM #TempTable)))
and c.IsDeleted = 0
Run Code Online (Sandbox Code Playgroud)

我想这是有道理的,因为我选择了多行并且需要解析每行各自的类别 id json。我只是不知道该怎么做/改变才能给我想要的结果。预先感谢您的任何帮助。

t-sql open-json

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

如何获取 JSON 字符串中行的详细行号

我有一个存储过程,它接受一个 NVARCHAR(max) 字符串,该字符串是我需要在将其加载到实时表之前验证的 JSON 数据。如果验证失败,我需要返回带有问题和错误数据行的行号的消息。这些行没有在 JSON 字符串中分配编号,但由它们在字符串中的存储顺序暗示。我正在尝试在 OPENJSON 函数期间分配一个增量编号。

使用 XML 时,我可以这样做:

SELECT ROW_NUMBER() OVER (ORDER BY item) AS rowOrder 
     , item.value('(./Id/text())[1]', 'bigInt') AS EId
     , item.value('(./Name/text())[1]', 'nvarchar(255)') AS EName
     , item.value('(./Number/text())[1]', 'nvarchar(30)') AS ENumber
FROM @ERow.nodes('/variable/item') AS main(item);
Run Code Online (Sandbox Code Playgroud)

派生它,但该技术不适用于 OPENJSON

如果可能的话,我宁愿不分两次进行 - 即将数据加载到临时表中,然后使用行号更新临时表中的行

SELECT ROW_NUMBER() OVER () AS rownum
     , newColumnName
     , decimal_column
     , nvarchar_column 
FROM OPENJSON(@JSON_String)
WITH (
    newColumnName BIGINT '$.id_column',
    decimal_column  DEC(28,8),
    nvarchar_column NVARCHAR(30)
)
Run Code Online (Sandbox Code Playgroud)

以为这会奏效,但没有运气。

想最终得到一张像 示例结果集

sql sql-server json row-number open-json

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

使用 Sql Server 2016 的 OPENJSON 函数从 Json 文档中的多个数组元素中选择结果

是否可以在 Sql Server 2016 中将来自多个数组元素的 json 文档的部分组合成单个结果?

鉴于此json:

{
  "fruit": {
    "types": [
      {
        "possible": [ "Apples", "Bananas", "Pears" ],
        "category": "Basic"
      },
      {
        "possible": [ "Oranges", "Grapefruit", "Lemons", "Limes" ],
        "category": "Citrus"
      },
      {
        "possible": [ "Blueberries", "Strawberries", "Cherries" ],
        "category": "Berries"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

我想看到来自可能元素的所有值的单个结果:

results
-----
Apples
Bananas
Pears
Oranges
Grapefruit
Lemons
Limes
Blueberries
Strawberries
Cherries
Run Code Online (Sandbox Code Playgroud)

我已经接近这样做了:

SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types[0].possible'))
UNION
SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types[1].possible'))
UNION
SELECT * FROM OPENJSON(JSON_QUERY(@json, '$.fruit.types[2].possible'))
Run Code Online (Sandbox Code Playgroud)

但这依赖于将查询与数组中的元素数量联系起来。有没有办法在不必单独指定每个数组元素的情况下做到这一点?像这样的东西(这些都不是有效的表达):

SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server json sql-server-2016 open-json

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

在SQL Server中打开Json一个Json字段到表

我在 SQL Server 中有一个表,其中一行包含一个 Json 列 - 如下所示:

响应文本 请求ID
{"LosUnqCod":0,"LosMidId":23} 96173722
{“LosUnqCod”:1,“LosMidId”:5} 96173721

我想要一张这样形状的桌子:

洛斯UnqCod 洛斯中号 请求ID
0 23 96173722
1 5 96173721

如何打开这个json?

t-sql sql-server json primary-key open-json

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