JSON FOR PATH в подвыборке возвращает только уникальные значения - PullRequest
0 голосов
/ 18 мая 2018

Если я делаю выборку с помощью newid (), я (как и ожидалось) получаю уникальное значение токена для строки охвата в результатах:

select top 3
person_id,
(
  select 
    newid() as token  
) as token
from person

приводит к

person_id, token

325537     6c3eba8f-a43f-4987-8571-02442e9e5979
339904     3ef9017a-90ac-42ec-a7ac-478767ae491b
470741     d4de6b1f-2a21-4bcb-8214-54eb40b2031e

, ноесли я заверну это в for json path, он сгенерирует один токен и использует его повторно:

select top 3
person_id,
(
  select 
    newid() as token
  for json path, without_array_wrapper  
) as token
from person

результаты

325537  {"token":"091C23DF-0D4D-4FBD-A6B6-4448375DAFD5"}
339904  {"token":"091C23DF-0D4D-4FBD-A6B6-4448375DAFD5"}
470741  {"token":"091C23DF-0D4D-4FBD-A6B6-4448375DAFD5"}

Если, однако, есть еще один уникальный значение в подвыборе токена, делающее результаты уникальными, все работает как ожидалось

select top 3
person_id,
(
  select 
    newid() as token,
    person_id
  for json path, without_array_wrapper  
) as token
from person

results

325537  {"token":"75638DAE-8861-4E38-81E5-EF558A7CFA81","person_id":325537}
339904  {"token":"1E223719-B08E-4930-8015-D5127F23A80B","person_id":339904}
470741  {"token":"8FE3524A-D6DB-4FE7-B526-C43B8F654929","person_id":470741}

Очевидно, что это связано с уникальностью результатов, но я могу 'Не могу найти какой-либо способ получить уникальное значение для каждой строки, не заполняя его данными, которые мне на самом деле не нужны.

Обновление , как обходной путь, разделяя newid () наCTE достигает цели, но я все еще не понимаю, что происходит с исходным запросом.

with records as (
  select top 10
  person_id, newid() as token
  from person p
)

select
  person_id,
  (select token for json path, without_array_wrapper) as context
from records

1 Ответ

0 голосов
/ 18 мая 2018

Мне удалось это сделать, отделив создание NEWID() от преобразования в json:

with x as (
    select top 3 p.person_id, NEWID() x
    from person p
)
select x.INVENTLOCATIONID, x.x, j.j
from x
    cross apply (
        select x.x for json path, without_array_wrapper
    )j(j)

btw, for xml также выдает одинаковые UID для всех строк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...