How to make JSON from SQL query in MS SQL 2014

后端 未结 2 1701
情歌与酒
情歌与酒 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:27

    Just for fun, I created a scalar function based off of my prior answer.

    Aside from the obvious XML parameter, I added two additional: 1) Include Header (illustrated below), and 2) ToLower case (I prefer my JSON field names in lower case which links to my classes and such).

    If the query is more than one record, a formatted array will be returned.

    Declare @Table table (ID int,Active bit,First_Name varchar(50),Last_Name varchar(50),EMail varchar(50))
    Insert into @Table values
    (1,1,'John','Smith','john.smith@email.com'),
    (2,0,'Jane','Doe'  ,'jane.doe@email.com')
    
    Select A.ID
          ,A.Last_Name
          ,A.First_Name
          ,B.JSON
    From  @Table A 
    Cross Apply (Select JSON=[dbo].[udf-Str-JSON](0,1,(Select A.* For XML Raw)) ) B
    

    Returns

    ID  Last_Name   First_Name  JSON
    1   Smith       John        {"id":"1","active":"1","first_name":"John","last_name":"Smith","email":"john.smith@email.com"}
    2   Doe         Jane        {"id":"2","active":"0","first_name":"Jane","last_name":"Doe","email":"jane.doe@email.com"}
    

    Or even more simply

    Select JSON=[dbo].[udf-Str-JSON](0,1,(Select * From @Table for XML RAW))
    

    Returns with Header ON

    {
        "status": {
            "successful": "true",
            "timestamp": "2016-10-09 06:08:16 GMT",
            "rows": "2"
        },
        "results": [{
            "id": "1",
            "active": "1",
            "first_name": "John",
            "last_name": "Smith",
            "email": "john.smith@email.com"
        }, {
            "id": "2",
            "active": "0",
            "first_name": "Jane",
            "last_name": "Doe",
            "email": "jane.doe@email.com"
        }]
    }
    

    Returns with Header Off

    [{
        "id": "1",
        "active": "1",
        "first_name": "John",
        "last_name": "Smith",
        "email": "john.smith@email.com"
    }, {
        "id": "2",
        "active": "0",
        "first_name": "Jane",
        "last_name": "Doe",
        "email": "jane.doe@email.com"
    }]
    

    The UDF

    ALTER FUNCTION [dbo].[udf-Str-JSON] (@IncludeHead int,@ToLowerCase int,@XML xml)
    Returns varchar(max)
    AS
    Begin
        Declare @Head varchar(max) = '',@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 R(xRow) 
                           Cross Apply R.xRow.nodes('./@*') As A(xAtt) )
              ,cteSum as (Select Records=count(Distinct Entity)
                                ,Head = IIF(@IncludeHead=0,IIF(count(Distinct Entity)<=1,'[getResults]','[[getResults]]'),Concat('{"status":{"successful":"true","timestamp":"',Format(GetUTCDate(),'yyyy-MM-dd hh:mm:ss '),'GMT','","rows":"',count(Distinct Entity),'"},"results":[[getResults]]}') ) 
                           From  cteEAV)
              ,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('"',IIF(@ToLowerCase=1,Lower(Attribute),Attribute),'":','"',Value,'"') 
                           From  cteEAV )
        Select @JSON = @JSON+NewRow+JSON+EndRow,@Head = Head From cteBld, cteSum
        Return Replace(@Head,'[getResults]',Stuff(@JSON,1,1,''))
    End
    -- Parameter 1: @IncludeHead 1/0
    -- Parameter 2: @ToLowerCase 1/0 (converts field name to lowercase
    -- Parameter 3: (Select * From ... for XML RAW)
    

    **EDIT - Corrected Typo

提交回复
热议问题