You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用EXEC sp_executesql执行动态SQL无法将动态列结果存入@jsonOutput求助

问题分析与解决

你的代码核心问题是:动态SQL里的FOR JSON AUTO只是执行查询返回结果,但没有把结果赋值给输出变量@jsonOutput。sp_executesql的输出参数需要在动态SQL内部被显式赋值才能传递出来。

修正后的JSON输出方案

调整动态SQL,将查询结果直接赋值给输出变量,代码如下:

DECLARE @sql NVARCHAR(MAX);
DECLARE @jsonOutput NVARCHAR(MAX);

-- 动态SQL内部将查询结果赋值给@jsonOutput
SET @sql = N'
SELECT @jsonOutput = (
    SELECT cf.mid, cf.sordt, d.*, x.*
    FROM #tempdrill d
    INNER JOIN b.conf cf 
        ON d.dd = cf.sordt
        AND d.hikey = cf.hkeyperson
        AND (SELECT dm FROM #tempp) = cf.mid
    INNER JOIN ' + QUOTENAME(@pt + 'x') + N' x 
        ON CAST(x.id AS VARCHAR(100)) = cf.id
    FOR JSON AUTO
)';

-- 执行动态SQL并获取输出
EXEC sp_executesql 
    @sql, 
    N'@jsonOutput NVARCHAR(MAX) OUTPUT', 
    @jsonOutput OUTPUT;

-- 查看结果
SELECT @jsonOutput AS JsonResult;

关键修改点:

  • 把原查询用括号包裹,通过SELECT @jsonOutput = (...)将JSON结果直接赋值给输出变量
  • 用QUOTENAME()处理动态表名(@pt + 'x'),避免SQL注入风险和表名含特殊字符的问题
  • 统一使用N'前缀定义Unicode字符串,符合SQL Server对NVARCHAR类型的要求

如果需要返回表格式结果

如果要直接返回动态列的表结果,不需要存入变量的话,可以直接执行动态SQL;如果要存入表结构,因为列是动态的,示例如下:

DECLARE @sql NVARCHAR(MAX);

-- 执行动态SQL将结果存入临时表
SET @sql = N'
SELECT cf.mid, cf.sordt, d.*, x.*
INTO #DynamicResult
FROM #tempdrill d
INNER JOIN b.conf cf 
    ON d.dd = cf.sordt
    AND d.hikey = cf.hkeyperson
    AND (SELECT dm FROM #tempp) = cf.mid
INNER JOIN ' + QUOTENAME(@pt + 'x') + N' x 
    ON CAST(x.id AS VARCHAR(100)) = cf.id';

EXEC sp_executesql @sql;

-- 查询临时表结果
SELECT * FROM #DynamicResult;

-- 用完清理临时表
DROP TABLE IF EXISTS #DynamicResult;

如果完全不知道动态表的列结构,可以先通过sys.columns获取列名再拼接创建表的SQL,具体逻辑可根据实际场景调整。

内容的提问来源于stack exchange,提问作者Dinesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:33:19