How to make JSON from SQL query in MS SQL 2014

后端 未结 2 1705
情歌与酒
情歌与酒 2020-12-31 14:12

Question: What is best solution to generate JSON from a SQL query in MS SQL 2014? I created a procedure, but it is very slow.

My Example:

DECLARE @cu         


        
2条回答
  •  星月不相逢
    2020-12-31 14:25

    The following should create the JSON array for just about any data set. However, I have not created a way to convert bit to true/false yet.

    Just one point to consider: The FIRST column in the initial SELECT has to be the Primary Key which is equates to the ENTITY field. In this case, Select * from @User for XML RAW ... ID is the Entity and just so happens to be the first field in the table

    As far as performance, 500 records with 19 fields creates a JSON string 191,987 bytes in 0.694 seconds (50 records in 0.098 seconds)

    Consider the following:

    Declare @User table (ID int,Active bit,First_Name varchar(50),Last_Name varchar(50),EMail varchar(50),LastOn DateTime)
    Insert into @User values
    (1,1,'John','Smith','john.smith@email.com','2016-10-05 17:32:41.903'),
    (2,0,'Jane','Doe'  ,'jane.doe@email.com','2016-10-05 08:25:18.203')
    
    Declare @XML   xml = (Select * From @User  for XML RAW)
    Declare @JSON  varchar(max) = ''
    
    ;with cteEAV as (
          Select RowNr     = Row_Number() over (Order By (Select NULL))
                ,Entity    = xRow.value('@*[1]','varchar(100)')
                ,Attribute = xAtt.value('local-name(.)','varchar(100)')
                ,Value     = xAtt.value('.','varchar(max)') 
           From  @XML.nodes('/row') As A(xRow)
           Cross Apply A.xRow.nodes('./@*') As B(xAtt) )
         ,cteBld as (
          Select *
                ,NewRow = IIF(Lag(Entity,1)  over (Partition By Entity Order By (Select NULL))=Entity,'',',{')
                ,EndRow = IIF(Lead(Entity,1) over (Partition By Entity Order By (Select NULL))=Entity,',','}')
                ,JSON   = Concat('"',Attribute,'":','"',Value,'"')
           From  cteEAV )
    Select @JSON = @JSON+NewRow+JSON+EndRow
     From  cteBld 
    
    Select '['+Stuff(@JSON,1,1,'')+']'
    

    Returns

    [{"ID":1, "Active":1, "First_Name":"John", "Last_Name":"Smith", "EMail":"john.smith@email.com", "LastOn":"2016-10-05T17:32:41.903", "TotalSales":25569.0000} ,{"ID":2, "Active":0, "First_Name":"Jane", "Last_Name":"Doe", "EMail":"jane.doe@email.com", "LastOn":"2016-10-05T08:25:18.203", "TotalSales":22888.0000}]
    

    A more readable version

    cteEAV will dynamically unpivot the data and generate the following:

    cteBLD will extend and add flags New/End Row

    The Final Select

    This will put it all together and generate one final string which can be wrapped or nested as you please.

提交回复
热议问题