如何移除JSON输出字符串中的'dbo'层级?
如何移除JSON输出字符串中的'dbo'层级?
这个问题很好解决,你看到的dbo层级是因为你用了带schema前缀的表名(比如dbo.Employee)作为JSON的键名——SQL Server的FOR JSON功能会把键名里的.当成嵌套对象的分隔符,所以自动把dbo.前面的部分解析成了外层对象。
要去掉它,只需要在拼接JSON字段别名的时候,把表名里的schema前缀(也就是dbo.这部分)去掉就行。具体修改你的存储过程步骤如下:
在游标获取
@tableName之后,添加一段代码来提取纯表名:
我们可以用CHARINDEX找到.的位置,然后截取后面的部分;同时考虑到有些表可能没有schema前缀,加个判断更稳妥。另外还要注意你原来的代码里拼接
@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
相关产品推荐
相关产品推荐

