Перевести запрос T-SQL Json на USQL - PullRequest
0 голосов
/ 13 декабря 2018

Привет. Я пытаюсь перевести эту логику из запроса T-sql json в usql.Но я не могу достичь тех же результатов.Мы будем благодарны за любую помощь.

select N'{
"rowid": "1",
"freeresponses": {
    "fr1": "1.1",
    "fr2": "1.1",
    "fr3": "1.3",
    "fr4": "1.4",
    "fr5": "1.4"
}
}'as jsontext
into dbo.tmp#


SELECT convert (int, JSON_VALUE(jsontext,'$.rowid' )) as rowid,
c.[key], c.[value]
FROM dbo.tmp#
cross apply openjson(json_query(jsontext,'$.freeresponses') )
as c;

результат будет таким на сервере SQL.

rowid | key | value

1     |  fr1| 1.1

1     |  fr2| 1.1

1     |  fr3| 1.3

1     | fr4 | 1.4

1     |  fr5| 1.4

Чтобы добиться того же результата в USQL, я пробовал ниже и ошибки.

REFERENCE ASSEMBLY Staging.[Newtonsoft.Json];
REFERENCE ASSEMBLY Staging.[Microsoft.Analytics.Samples.Formats]; 
USING Microsoft.Analytics.Samples.Formats.Json;


DECLARE @inputmasterfileset string = "/sourcedata/samplefreeresponse.txt";
DECLARE @outputfreeresponse string = "/sourcedata/samplefreeresponseoutput.txt";


@freeresponse1 =
EXTRACT rowid string,
        freeresponses  string
FROM @inputmasterfileset
USING new JsonExtractor("");


@freeresponse2 =
SELECT rowid,
       JsonFunctions.JsonTuple(freeresponses).Values AS freeresponses
FROM @freeresponse1;

@freeresponse3 =
SELECT rowid
       ,JsonFunctions.JsonTuple(free) AS values
FROM @freeresponse2
     CROSS APPLY
         EXPLODE(freeresponses) AS c(free);

OUTPUT @freeresponse3
TO @outputfreeresponse
USING Outputters.Text('|', outputHeader:true,quoting:false);

Проблема в том, что я не знаю, как ключи называются документом json, поэтому я не могу указать JsonFunctions.JsonTuple (free) ["fr1"] на этапе 3 кода, и я хочу получить результаттак же, как то, что я получил в T-SQL.

Очень ценится.

1 Ответ

0 голосов
/ 18 декабря 2018

Я решил это сам.Это была путаница с SQL MAP и SQL ARRAY.

...