SQL SERVER查詢到的數據轉為Json格式


數據表如下:

Area 平台表:

Province 省份表:

District 區域表:

Area下級為:Province,Province下級為District

查詢出的效果如下:

 

功能實現如下:(使用for xml來實現功能)

第一步:

--合並區域列,將合並的數據保存到臨時表#temp_Province

select ProvinceID,ProvinceName,'{'+left(DistrictList,len(DistrictList)-1)+'}' as DistrictList,AreaID into #temp_Province
from (select ProvinceID,ProvinceName,AreaID,
   isnull((select '"District'+CAST(ROW_NUMBER() over(order by District.DistrictID) as nvarchar(50))+'":{'
      + '"DistrictID":"'+cast(DistrictID as nvarchar(100))+'",'
      +'"DistrictIName":"'+DistrictIName+'"},'
    from District where District.ProvinceID= Province.ProvinceID for xml path('')),'"District":"",') as DistrictList
   from Province)
as Province2

#temp_Province表查詢到的數據如下:

第二步:

--合並省份列 將合並的數據保存到臨時表#temp_Area
select AreaID,AreaName,'{'+left(AreaList,len(AreaList)-1)+'}' as AreaList into #temp_Area
from (select AreaID,AreaName,
     isnull((select '"Province' +CAST(ROW_NUMBER() over(order by #temp_Province.ProvinceID) as nvarchar(50))+'":{'
      +'"ProvinceID":"'+cast(ProvinceID as nvarchar(100))+'",'
      +'"ProvinceName":"'+ProvinceName+'",'
      +'"DistrictList":'+DistrictList+'},'
      from #temp_Province where Area.AreaID=#temp_Province.AreaID for xml path('')),'"Province":"",') as AreaList
       from Area)
as Area2

#temp_Area查詢到的數據如下:

 

第三步:

--合並平台列,查詢出最終的結果
select '{'+cast(stuff(
 (select ',"Area'+CAST(ROW_NUMBER() over(order by #temp_Area.AreaID) as nvarchar(50))+'":{'
     +'"AreaID":"'+cast(AreaID as nvarchar(100))+'",'
     +'"AreaName":"'+AreaName+'",'
     +'"AreaList":'+AreaList+'}'
 from #temp_Area  for xml path('')),1,1,'') as nvarchar(max))+'}'

第四步:

--刪除臨時表

drop table #temp_Province
drop table #temp_Area

最終查詢到的效果如下:

{"Area1":{"AreaID":"4","AreaName":"華中","AreaList":{"Province":""}},"Area2":{"AreaID":"5","AreaName":"西北","AreaList":{"Province1":{"ProvinceID":"28","ProvinceName":"陝西","DistrictList":{"District1":{"DistrictID":"210","DistrictIName":"西安"},"District2":{"DistrictID":"211","DistrictIName":"咸陽"},"District3":{"DistrictID":"363","DistrictIName":"延安"},"District4":{"DistrictID":"364","DistrictIName":"榆林"}}},"Province2":{"ProvinceID":"39","ProvinceName":"青海","DistrictList":{"District":""}}}},"Area3":{"AreaID":"6","AreaName":"華南","AreaList":{"Province1":{"ProvinceID":"14","ProvinceName":"廣西","DistrictList":{"District1":{"DistrictID":"154","DistrictIName":"玉林"}}},"Province2":{"ProvinceID":"15","ProvinceName":"海南","DistrictList":{"District1":{"DistrictID":"164","DistrictIName":"臨高縣"},"District2":{"DistrictID":"165","DistrictIName":"陵水黎族自治縣"},"District3":{"DistrictID":"171","DistrictIName":"文昌市"},"District4":{"DistrictID":"172","DistrictIName":"五指山市"},"District5":{"DistrictID":"368","DistrictIName":"海南省直轄縣"}}}}}}

 

 

得到需求要的效果:

 

 

注意:

以Area表為主表,串聯3張表:

select Area.AreaID,Area.AreaName,Province.ProvinceID,Province.ProvinceName,District.DistrictID,District.DistrictIName from Area
left join Province on Province.AreaID=Area.AreaID
left join District on District.ProvinceID=Province.ProvinceID
order by Area.AreaID,Area.AreaName,Province.ProvinceID,Province.ProvinceName,District.DistrictID,District.DistrictIName

得到如圖所示結果:

  有圖可見:華中平台下是沒有省份的,西北-青海下是沒有區域的。

在創建臨時表若沒有對NULL的情況做判斷,則會有數據丟失

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM