0

需要通过 OpenQuery 在 MS SQL 上针对 DB2 运行动态 SQL,以 JSON 格式返回结果,然后将其作为输出参数返回到存储过程中

如示例代码所示,我尝试使用表变量,但出现此错误:

INSERT 语句中不允许使用 FOR JSON 子句

我也尝试将查询包装到 CTE 中,但鉴于 JSON 列名更改,我无法使用 * 或出现此错误:

没有为“tbl”的第 1 列指定列名。

所以我很茫然。我需要运行它并在 Output 参数中获取 JSON,但鉴于我必须通过 OpenQuery 和动态 SQL 混合调用 DB2 来设置参数,所以我找不到有效的语法。

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

我要查找的结果是输出参数@outJSON 中的 JSON 字符串。

4

1 回答 1

0

获取数据后应用 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;
于 2019-06-21T21:25:10.770 回答