从Azure SQL中非常嵌套的JSON中提取数据

问题描述 投票:0回答:1

我已嵌套JSON文件:

"vehicleStatusResponse": {
    "vehicleStatuses": [
        {
            "vin": "ABC1234567890",
            "triggerType": {
                "triggerType": "TIMER",
                "context": "RFMS",
                "driverId": {
                    "tachoDriverIdentification": {
                        "driverIdentification": "123456789",
                        "cardIssuingMemberState": "BRA",
                        "driverAuthenticationEquipment": "CARD",
                        "cardReplacementIndex": "0",
                        "cardRenewalIndex": "1"
                    }
                }
            },
            "receivedDateTime": "2020-02-12T04:11:19.221Z",
            "hrTotalVehicleDistance": 103306960,
            "totalEngineHours": 3966.6216666666664,
            "driver1Id": {
                "tachoDriverIdentification": {
                    "driverIdentification": "BRA1234567"
                }
            },
            "engineTotalFuelUsed": 48477520,
            "accumulatedData": {
                "durationWheelbaseSpeedOverZero": 8309713,
                "distanceCruiseControlActive": 8612200,
                "durationCruiseControlActive": 366083,
                "fuelConsumptionDuringCruiseActive": 3064170,
                "durationWheelbaseSpeedZero": 5425783,
                "fuelWheelbaseSpeedZero": 3332540,
                "fuelWheelbaseSpeedOverZero": 44709670,
                "ptoActiveClass": [
                    {
                        "label": "wheelbased speed >0",
                        "seconds": 16610,
                        "meters": 29050,
                        "milliLitres": 26310
                    },
                    {
                        "label": "wheelbased speed =0",
                        "seconds": 457344,
                        "milliLitres": 363350

它已经从Azure BLOB存储导入到SQL DB,现在我需要从中提取数据到表。我已经使用了T-SQL请求来执行此操作,但是它返回了只有标头的空白表:

SELECT response.*
    FROM OPENROWSET (BULK 'response3.json', DATA_SOURCE = 'VCBI24', SINGLE_CLOB) as j
    CROSS APPLY OPENJSON(BulkColumn)
    WITH ( vehiclestatusResponse nvarchar (100), vehicleStatuses nvarchar (100), vin nvarchar (100), triggerType nvarchar (100), context nvarchar (100) and etc...) AS response 

我该如何处理?

非常感谢您的关注!

json azure azure-sql-database etl azure-storage-blobs
1个回答
0
投票
您可以提供带有OPENJSON的路径,该路径允许您深入到嵌套的JSON,例如

SELECT * FROM OPENJSON( @json, '$.vehicleStatusResponse.vehicleStatuses' ) WITH ( vin VARCHAR(50) '$.vin', triggerType VARCHAR(50) '$.triggerType.triggerType', context VARCHAR(50) '$.triggerType.context', driverIdentification VARCHAR(50) '$.triggerType.driverId.tachoDriverIdentification.driverIdentification', cardIssuingMemberState VARCHAR(50) '$.triggerType.driverId.tachoDriverIdentification.cardIssuingMemberState', receivedDateTime DATETIME '$.receivedDateTime', engineTotalFuelUsed INT '$.engineTotalFuelUsed' )

完整脚本示例:

DECLARE @json VARCHAR(MAX) = '{ "vehicleStatusResponse": { "vehicleStatuses": [ { "vin": "ABC1234567890", "triggerType": { "triggerType": "TIMER", "context": "RFMS", "driverId": { "tachoDriverIdentification": { "driverIdentification": "123456789", "cardIssuingMemberState": "BRA", "driverAuthenticationEquipment": "CARD", "cardReplacementIndex": "0", "cardRenewalIndex": "1" } } }, "receivedDateTime": "2020-02-12T04:11:19.221Z", "hrTotalVehicleDistance": 103306960, "totalEngineHours": 3966.6216666666664, "driver1Id": { "tachoDriverIdentification": { "driverIdentification": "BRA1234567" } }, "engineTotalFuelUsed": 48477520, "accumulatedData": { "durationWheelbaseSpeedOverZero": 8309713, "distanceCruiseControlActive": 8612200, "durationCruiseControlActive": 366083, "fuelConsumptionDuringCruiseActive": 3064170, "durationWheelbaseSpeedZero": 5425783, "fuelWheelbaseSpeedZero": 3332540, "fuelWheelbaseSpeedOverZero": 44709670, "ptoActiveClass": [ { "label": "wheelbased speed >0", "seconds": 16610, "meters": 29050, "milliLitres": 26310 }, { "label": "wheelbased speed =0", "seconds": 457344, "milliLitres": 363350 } ] } } ] }}}}}}}}' SELECT * FROM OPENJSON( @json, '$.vehicleStatusResponse.vehicleStatuses' ) WITH ( vin VARCHAR(50) '$.vin', triggerType VARCHAR(50) '$.triggerType.triggerType', context VARCHAR(50) '$.triggerType.context', driverIdentification VARCHAR(50) '$.triggerType.driverId.tachoDriverIdentification.driverIdentification', cardIssuingMemberState VARCHAR(50) '$.triggerType.driverId.tachoDriverIdentification.cardIssuingMemberState', receivedDateTime DATETIME '$.receivedDateTime', engineTotalFuelUsed INT '$.engineTotalFuelUsed' )

我的结果:

Results

在此处阅读有关OPENJSON的更多信息:

https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql?view=sql-server-ver15

© www.soinside.com 2019 - 2024. All rights reserved.