我想在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) 上下文:我在修改 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) 我正在尝试直接连接到 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 直接路径打开文件的其他方式。
我正在尝试为嵌套数组设置 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) 我有一个 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) 我有一个包含多行的临时表,每一行都有一个名为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。我只是不知道该怎么做/改变才能给我想要的结果。预先感谢您的任何帮助。
我有一个存储过程,它接受一个 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 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 列 - 如下所示:
| 响应文本 | 请求ID |
|---|---|
| {"LosUnqCod":0,"LosMidId":23} | 96173722 |
| {“LosUnqCod”:1,“LosMidId”:5} | 96173721 |
我想要一张这样形状的桌子:
| 洛斯UnqCod | 洛斯中号 | 请求ID |
|---|---|---|
| 0 | 23 | 96173722 |
| 1 | 5 | 96173721 |
如何打开这个json?
open-json ×9
json ×5
sql-server ×5
t-sql ×3
sql ×2
arrays ×1
azure ×1
hierarchy ×1
parsing ×1
primary-key ×1
pyspark ×1
row-number ×1