VS Сбои при использовании T-SQL OPENJSON и SELECT * - PullRequest
0 голосов
/ 23 мая 2019

При использовании приведенного ниже кода VS 2019 аварийно завершил работу.Хотя изначально он работал, возможно, до недавнего обновления (или обновления до VS 2019 с VS 2017)

В сообщении об ошибке указан слишком длинный идентификатор, связанный с конкретным файлом.Я временно решил эту проблему, открыв свой проект через Team Explorer, а не в окне запуска.Он всплыл, как только я отредактировал файл.Так что я построчно нашел виновника, код ниже - виновник.Я не могу понять, почему это вызывает сбой.


DECLARE @Characteristics nvarchar(4000) = (SELECT * FROM OPENJSON(@Details)
WITH ([Firstname] nvarchar(256) N'$.firstname',[Lastname] nvarchar(256) N'$.lastname') FOR JSON PATH, WITHOUT_ARRAY_WRAPPER);

Это допустимая команда, и SQL принимает, включая развертывания.Для моих целей и потому, что я управляю предложением WITH, «SELECT *» является приемлемым отклонением от моей практики указания столбцов в предложении SELECT.

VS больше не падает после того, как я объявил каждый ожидаемый столбец впредложение SELECT.Если у кого-то есть альтернативное решение для решения этой проблемы, я был бы признателен.

1 Ответ

0 голосов
/ 23 мая 2019

Вы не показываете достаточно - по крайней мере для меня - чтобы полностью понять вашу проблему ...

Что я получаю:

  • Вы хотите использовать SELECT *
  • Вы управляете предложением WITH (я полагаю: вы динамически создаете его в своем приложении)

Вы не показывали фактическое сообщение об ошибке (пожалуйста, сделайте это в следующий раз), но я получаю, что ошибка зависит от разницы

  • SELECT * FROM ...
  • SELECT Firstname, Lastname FROM ...

Я не могу воспроизвести вашу проблему, но, полагаю, в вашем фактическом утверждении содержится больше источников, и что * может включать в себя больше, чем вы нам сообщите.

Вы пытались использовать псевдоним таблицы после WITH?

DECLARE @Details NVARCHAR(MAX)=N'[{"a":"a1", "b":"b1"},{"a":"a2","b":"b2"}]';

SELECT
(
    SELECT tbl.*              --<-- Using "tbl.*" instead of "*"
    FROM OPENJSON(@Details)
    WITH(a NVARCHAR(100)
        ,b NVARCHAR(100)) tbl --<-- table alias "tbl"
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
);
...