Необходимо объединить динамический SQL, Open Query, JSON, динамические переменные и несколько других странностей в один запрос - PullRequest
0 голосов
/ 21 июня 2019

Необходимо запустить динамический SQL для DB2 на MS SQL через OpenQuery, получить результаты обратно в JSON, а затем вернуть его как выходной параметр в хранимой процедуре

Я пытался использовать переменную таблицы в качестве примеракод показывает, но я получаю эту ошибку:

Предложение FOR JSON не допускается в операторе INSERT

Я также пытался обернуть запрос в CTE,но, учитывая изменения имени столбца JSON, я не могу использовать * или получаю эту ошибку:

Не указано имя столбца для столбца 1 таблицы tbl.

Так что я в растерянности.Мне нужно запустить это и получить JSON в параметре Output, но, учитывая, что мне нужно смешать вызов DB2 через OpenQuery и динамический SQL, чтобы установить параметр, я не могу найти синтаксис, который работает.

create procedure uspTesting (
    @inAccountNumber nvarchar(20), 
    @outJSON nvarchar(max) output)
as
begin declare @result table (ResultJson nvarchar(max));

    declare @tsql nvarchar(4000) = '
    select name, age
    from  openquery(db2link,''
        select  name, 
                age 
        from    db2.account 
        where   accountnumber = ''''' + @inAccountNumber + ''''')'') tbl for json auto';

    insert into @result
    EXEC (@TSQL);

    select @outJSON = ResultJson from @result; End

Результаты, которые я ищу, - это строка JSON в выходном параметре @ outJSON.

1 Ответ

0 голосов
/ 22 июня 2019

Примените FOR JSON после того, как вы получили данные, загрузите их во временную таблицу и затем используйте FOR JSON.

Без тестовых данных и т. Д. Вам, возможно, придется настроить это, но попробуйте что-то вроде:

CREATE PROCEDURE [uspTesting]
    (
        @inAccountNumber NVARCHAR(20)
      , @outJSON NVARCHAR(MAX) OUTPUT
    )
AS
    BEGIN
        DECLARE @result TABLE
            (
                [name] NVARCHAR(100) --whatever data type you need here
              , [age] NVARCHAR(100)
            );

        DECLARE @tsql NVARCHAR(4000) = '
    select name, age
    from  openquery(db2link,''
        select  name, 
                age 
        from    db2.account 
        where   accountnumber = ''' + @inAccountNumber + ''')';

        --Here we will just load a table variable with the data.
        INSERT INTO @result
        EXEC ( @tsql );

        --Then we will select from that table variable applying the JSON here.
        SET @outJSON = (
                           SELECT *
                           FROM   @result
                           FOR JSON AUTO
                       );

    END;
...