将嵌套的JSON数据加载到MS SQL中(返回空值)
我将一个非常简单的JSON文件引入MS SQL数据库。我已经创建了表,当我进行查询时,除了一个名为“Address”的嵌套部分外,我可以将所有数据都处理得很好 JSON的片段:将嵌套的JSON数据加载到MS SQL中(返回空值),sql,json,sql-server,nested,Sql,Json,Sql Server,Nested,我将一个非常简单的JSON文件引入MS SQL数据库。我已经创建了表,当我进行查询时,除了一个名为“Address”的嵌套部分外,我可以将所有数据都处理得很好 JSON的片段: { "sold_price": Sample, "auction_date": "Sample", "address": { "state": "Sample", "street": "Sample", "number": "Sample", "suburb":
{
"sold_price": Sample,
"auction_date": "Sample",
"address": {
"state": "Sample",
"street": "Sample",
"number": "Sample",
"suburb": "Sample",
"postcode": "Sample",
"country": "Sample"
},
},
"REA_Agent": "Sample",
"sale_date": "2018-08-03 00:13:04+00:00",
},
DECLARE @BT1 VARCHAR(MAX)
SELECT @BT1 =
BulkColumn
FROM OPENROWSET(BULK'C:\JSON Test\BT1.json', SINGLE_BLOB) JSON
SELECT @BT1 as BT1_Table;
IF (ISJSON(@BT1) = 1)
BEGIN
PRINT 'JSON File is valid';
INSERT INTO BT1
SELECT *
FROM OPENJSON(@BT1)
WITH(
[state] VARCHAR(MAX) '$.state',
[number] VARCHAR(MAX) '$.number',
[street] VARCHAR(MAX) '$.street',
[suburb] VARCHAR(MAX) '$.suburb',
[postcode] INTEGER '$.postcode',
[property_type] VARCHAR(MAX) '$.property_type',
[sold_price] VARCHAR(MAX) '$.sold_price',
[sold_date] DATE '$.sold_date',
[settlement_date] DATE '$.settlement_date',
[agency_name] VARCHAR(MAX) '$.agency_name',
[bedrooms] INTEGER '$.bedrooms',
[bathrooms] INTEGER '$.bathrooms',
[parking] INTEGER '$.parking',
[auction_date] DATE '$.auction_date',
[passed_in] VARCHAR(MAX) '$.passed_in',
[will_disclose_sold] VARCHAR(MAX) '$.will_disclose_sold'
)
END
ELSE
BEGIN
PRINT 'JSON File is invalid';
END
加载JSON的过程:
{
"sold_price": Sample,
"auction_date": "Sample",
"address": {
"state": "Sample",
"street": "Sample",
"number": "Sample",
"suburb": "Sample",
"postcode": "Sample",
"country": "Sample"
},
},
"REA_Agent": "Sample",
"sale_date": "2018-08-03 00:13:04+00:00",
},
DECLARE @BT1 VARCHAR(MAX)
SELECT @BT1 =
BulkColumn
FROM OPENROWSET(BULK'C:\JSON Test\BT1.json', SINGLE_BLOB) JSON
SELECT @BT1 as BT1_Table;
IF (ISJSON(@BT1) = 1)
BEGIN
PRINT 'JSON File is valid';
INSERT INTO BT1
SELECT *
FROM OPENJSON(@BT1)
WITH(
[state] VARCHAR(MAX) '$.state',
[number] VARCHAR(MAX) '$.number',
[street] VARCHAR(MAX) '$.street',
[suburb] VARCHAR(MAX) '$.suburb',
[postcode] INTEGER '$.postcode',
[property_type] VARCHAR(MAX) '$.property_type',
[sold_price] VARCHAR(MAX) '$.sold_price',
[sold_date] DATE '$.sold_date',
[settlement_date] DATE '$.settlement_date',
[agency_name] VARCHAR(MAX) '$.agency_name',
[bedrooms] INTEGER '$.bedrooms',
[bathrooms] INTEGER '$.bathrooms',
[parking] INTEGER '$.parking',
[auction_date] DATE '$.auction_date',
[passed_in] VARCHAR(MAX) '$.passed_in',
[will_disclose_sold] VARCHAR(MAX) '$.will_disclose_sold'
)
END
ELSE
BEGIN
PRINT 'JSON File is invalid';
END
什么不起作用:
{
"sold_price": Sample,
"auction_date": "Sample",
"address": {
"state": "Sample",
"street": "Sample",
"number": "Sample",
"suburb": "Sample",
"postcode": "Sample",
"country": "Sample"
},
},
"REA_Agent": "Sample",
"sale_date": "2018-08-03 00:13:04+00:00",
},
DECLARE @BT1 VARCHAR(MAX)
SELECT @BT1 =
BulkColumn
FROM OPENROWSET(BULK'C:\JSON Test\BT1.json', SINGLE_BLOB) JSON
SELECT @BT1 as BT1_Table;
IF (ISJSON(@BT1) = 1)
BEGIN
PRINT 'JSON File is valid';
INSERT INTO BT1
SELECT *
FROM OPENJSON(@BT1)
WITH(
[state] VARCHAR(MAX) '$.state',
[number] VARCHAR(MAX) '$.number',
[street] VARCHAR(MAX) '$.street',
[suburb] VARCHAR(MAX) '$.suburb',
[postcode] INTEGER '$.postcode',
[property_type] VARCHAR(MAX) '$.property_type',
[sold_price] VARCHAR(MAX) '$.sold_price',
[sold_date] DATE '$.sold_date',
[settlement_date] DATE '$.settlement_date',
[agency_name] VARCHAR(MAX) '$.agency_name',
[bedrooms] INTEGER '$.bedrooms',
[bathrooms] INTEGER '$.bathrooms',
[parking] INTEGER '$.parking',
[auction_date] DATE '$.auction_date',
[passed_in] VARCHAR(MAX) '$.passed_in',
[will_disclose_sold] VARCHAR(MAX) '$.will_disclose_sold'
)
END
ELSE
BEGIN
PRINT 'JSON File is invalid';
END
加载后-我只运行了一个基本的Select*来查看,“Address”中的所有字段都返回空值
这里有我错过的把戏吗?我所有的调用都返回NULL,我不知道为什么。(如果我可以缩短进程,很高兴收到关于我的代码的反馈/犯了错误)您想从名为
address
的嵌套元素中读取数据,因此您必须在中指定.address
,并为来自嵌套部分的每个值指定子句:
INSERT INTO BT1
SELECT *
FROM OPENJSON(@BT1)
WITH(
[state] VARCHAR(MAX) '$.address.state', --<< added ".address"
[number] VARCHAR(MAX) '$.address.number', --<< added ".address"
[street] VARCHAR(MAX) '$.address.street', --<< added ".address"
[suburb] VARCHAR(MAX) '$.address.suburb', --<< added ".address"
[postcode] INTEGER '$.address.postcode',--<< added ".address"
[sold_price] VARCHAR(MAX) '$.sold_price',
[auction_date] DATE '$.auction_date',
[sold_date] DATE '$.sold_date',
[settlement_date] DATE '$.settlement_date',
[agency_name] VARCHAR(MAX) '$.agency_name',
[bedrooms] INTEGER '$.bedrooms',
[bathrooms] INTEGER '$.bathrooms',
[parking] INTEGER '$.parking',
[passed_in] VARCHAR(MAX) '$.passed_in',
[will_disclose_sold] VARCHAR(MAX) '$.will_disclose_sold',
[property_type] VARCHAR(MAX) '$.property_type'
)
如果这与您的结构不同,请更新您的问题并让我知道