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

如何移除JSON输出字符串中的'dbo'层级?

如何移除JSON输出字符串中的'dbo'层级?

这个问题很好解决,你看到的dbo层级是因为你用了带schema前缀的表名(比如dbo.Employee)作为JSON的键名——SQL Server的FOR JSON功能会把键名里的.当成嵌套对象的分隔符,所以自动把dbo.前面的部分解析成了外层对象。

要去掉它,只需要在拼接JSON字段别名的时候,把表名里的schema前缀(也就是dbo.这部分)去掉就行。具体修改你的存储过程步骤如下:

  1. 在游标获取@tableName之后,添加一段代码来提取纯表名:
    我们可以用CHARINDEX找到.的位置,然后截取后面的部分;同时考虑到有些表可能没有schema前缀,加个判断更稳妥。

  2. 另外还要注意你原来的代码里拼接@sqlQuery时,漏加了FOR JSON path, INCLUDE_NULL_VALUES(虽然你贴的最终查询里有,但存储过程里的拼接逻辑是缺失的),这部分必须加上,否则原始查询不会返回JSON格式的结果,Json_Query也无法正确工作。

修改后的完整存储过程代码如下:

Create Proc [dbo].[getEmployeeJsonByEmployeeId]
@EmployeeID int
AS
Begin
    declare @json varchar(max) = '';
    declare my_cursor CURSOr for
        select TableName, SQLQuery from EmployeeArchiveTable where employeeID = @employeeID;
    declare @tableName varchar(50);
    declare @sqlQuery varchar(max);

    Fetch next from my_cursor into @tableName,@sqlQuery;
    while @@FETCH_STATUS = 0
    Begin
        -- 移除表名中的schema前缀(比如dbo.)
        IF CHARINDEX('.', @tableName) > 0
            SET @tableName = RIGHT(@tableName, LEN(@tableName) - CHARINDEX('.', @tableName))
        
        -- 拼接SQL时要加上FOR JSON部分,确保子查询返回JSON
        select @json += 'Json_Query((' + @sqlQuery + ' FOR JSON path, INCLUDE_NULL_VALUES)) as [' + @tableName + '], ';
        
        fetch next from my_cursor into @tableName, @sqlQuery;
    End

    close my_cursor;
    -- 去掉最后多余的逗号
    select @json = 'select ' + substring(@json,1,LEN(@json) - 2) + ' FOR JSON Path, WITHOUT_ARRAY_WRAPPER';
    print @json;
    -- 执行生成的SQL并返回结果
    exec(@json); -- 注意这里原来的select @json只是返回拼接后的SQL,要改成exec才会执行并返回JSON
End;

关键修改点说明:

  • 新增了处理@tableName的逻辑,去掉了dbo.前缀,这样生成的字段别名是[Employee]而不是[dbo.Employee],JSON就不会生成dbo层级了。
  • 拼接@sqlQuery时补充了FOR JSON path, INCLUDE_NULL_VALUES,确保子查询返回的是JSON字符串,Json_Query可以正确包装它,避免JSON转义问题。
  • 最后把select @json改成exec(@json),这样存储过程会直接执行拼接好的SQL,返回你想要的JSON结果,而不是返回拼接后的SQL语句。

修改后生成的最终SQL会变成:

select Json_Query((select * from employee where EmployeeID = 1 FOR JSON path, INCLUDE_NULL_VALUES)) as [Employee],
Json_Query((select * from Payroll where EmployeeID = 1 FOR JSON path, INCLUDE_NULL_VALUES)) as [Payroll],
Json_Query((select * from Leaves where EmployeeID = 1 FOR JSON path, INCLUDE_NULL_VALUES)) as [Leaves],
Json_Query((select * from Division where EmployeeID = 1 FOR JSON path, INCLUDE_NULL_VALUES)) as [Division] FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

对应的JSON输出就会是你预期的结构:

{
  "Employee" : { /*employee data*/ },
  "Payroll"  : { /*payroll data*/ },
  "Leaves"   : { /*leaves data*/ },
  "Division" : { /*division data*/ }
}

备注:内容来源于stack exchange,提问作者I Love Stackoverflow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:47:40