使用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
相关产品推荐
相关产品推荐

