После фиксации вашего фрагмента JSON, чтобы:
{
"relation": {
"relationid": "123456",
"name": "relation1",
"addresses": {
"address": [{
"addressid": "1",
"street": "Street 1",
"postcode": "1234 AB",
"city": "City 1"
}, {
"addressid": "2",
"street": "Street 2",
"postcode": "5678 CD",
"city": "City 2"
}]
}
}
}
и положить его в файл, следующий сценарий будет получить, что вы хотите. Обратите внимание, что вам нужно перейти вниз по структуре, чтобы нести вдоль элементов более высокого уровня, и как только вы столкнулись с массивом, вы получите CROSS APPLY EXPLODE
, если вам нужны только те, у которых есть массив, или OUTER APPLY EXPLODE, если вам нужны строки с отсутствующими массивами.
DECLARE @input string = @"/temp/stackoverflow.json";
REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];
@json =
EXTRACT relationid int,
name string,
addresses string
FROM @input
USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor("relation");
@relation =
SELECT relationid,
name,
Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(addresses)["address"] AS address_array
FROM @json;
@addresses =
SELECT relationid,
name,
Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(address) AS address
FROM @relation
CROSS APPLY
EXPLODE (Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(address_array).Values) AS A(address);
@result =
SELECT relationid,
name,
address["addressid"]AS addressid,
address["street"]AS street,
address["postcode"]AS postcode,
address["city"]AS city
FROM @addresses;
OUTPUT @result
TO "https://stackoverflow.com/users/temp/st_out.csv"
USING Outputters.Csv();
, пожалуйста, отправьте свой код, чтобы исправить ошибку. – morels