2016-10-31 3 views
1

나는 다음과 같은 시나리오가 :만들기 JSON

class question { 
    idQuestion: string; 
    question: string; 
    type: string; 
} 

class options { 
    idOption: string; 
    option: string; 
} 

내 SQL 반환 :

idquestion question type idoption option 

예 :

question1 foo? textbox null null 
question2 bar? select option1 aaa 
question2 bar? select option2 bbb 
question3 foobar? radio option1 aaa 
question3 foobar? radio option2 bbb 
question3 foobar? radio option3 ccc 

내가에 SQL 응답을 매핑 할을 다음 인터페이스 :

questionOptions{ 
    question: Question; 
    options: Option[]; 
} 

어떻게 할 수 있습니까? 그래서 결국, 나는 질문 목록을 가질 수 있었고, 각각은 옵션 목록을 포함하고있었습니다.

P.S : sql 데이터베이스의 질문과 옵션을 연결하는 것이 더 나은 옵션입니까?

편집 : 나는 다음과 같은 JSON을 얻기 위해 원하는 샘플 데이터에서

:

[ 
    { 
    idQuestion: "question1", 
    question: "foo?", 
    options: [] 
    }, 
    { 
    idQuestion: "question2", 
    question: "bar?" 
    options: [ 
     { 
     idOption: "option1", 
     option: "aaa" 
     }, 
     { 
     idOption: "option2", 
     option: "bbb" 
     }, 
    ] 
    } 
] 
+0

SQL 서버의 버전은 무엇? 2016은 JSON에 대한 지원을 도입했습니다.이 기능은 쿼리에서 출력의 형식을 지정하는 데 도움이 될 수 있습니다. – alroc

+0

샘플 데이터를 사용하여 실제 원하는 JSON을 제공하십시오. 내가 뭔가를 도울 수 있습니다 –

+0

@alroc 우리는 SQL 서버를 가지고 2014 –

답변

1

나는 사실상 JSON 문자열/배열로 설정 한 행/데이터를 변환하는 도우미 함수가 있습니다.

가정 2012+

Declare @YourData table (idQuestion varchar(50),question varchar(50), type varchar(50),idOption varchar(50),[option] varchar(50)) 
Insert Into @YourData values 
('question1','foo?','textbox', null, null), 
('question2','bar?','select','option1','aaa'), 
('question2','bar?','select','option2','bbb'), 
('question3','foobar?','radio','option1','aaa'), 
('question3','foobar?','radio','option2','bbb'), 
('question3','foobar?','radio','option3','ccc') 


Declare @JSON varchar(max) = '' 
Select @[email protected]+','+String 
From (
     Select String=Replace(B.JSON,'}',',"options":'+IsNull(C.JSON,'[]')+'}') 
     From (Select Distinct idquestion,question From @YourData) A 
     Cross Apply (Select JSON=[dbo].[udf-Str-JSON](0,0,(Select A.idQuestion,A.question for XML RAW))) B 
     Cross Apply (Select JSON=[dbo].[udf-Str-JSON](0,0,(Select idOption,[option] from @YourData Where idquestion=A.idquestion for XML RAW))) C 
     ) A 

Select '['+Stuff(@JSON,1,1,'')+']' 

반환

UDF를

enter image description here

CREATE 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),'"},"retults":[[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)