Если я делаю выборку с помощью 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