我有一个sproc工作流程如下:
Rextester:http://rextester.com/PUX22792
temp1表有一列q1,它实际上是从#ans表和援助列(varchar)中分组的。 q1被声明为bit,但是它来自varchar列。所以在最终的XML表中,我按原样选择了这个列[q1],当我将XML输出转换为JSON时,我仍然可以看到该列是字符串而不是位。我已经创建了一个带有所有样本数据的rextester链接。任何帮助将不胜感激!
答案 0 :(得分:1)
我没有看到你的SQL如何布局有任何问题,它只是你用于XML到JSON的转换工具处理位数据类型的方式。除非您使用XML模式定义(XSD),否则XML不会在数据类型之间清晰地描述,而JSON是强类型的,其中可以清楚地指定数字,布尔值,字符串,空字符串,空对象和空值。因此,如果您查看下面的xml元素,它可以是或:
<h1>NAVIGATION BAR</h1>
<div id="nav">
<ul>
<li>HOME</li>
<li>ABOUT</li>
<li>CONTACT</li>
</ul>
</div>
因此,默认的XML to JSON转换将所有内容视为字符串,因此您将位0/1视为字符串表示“0”&amp; “1”。在中间件应用程序代码中,您将不得不使用带有xml&amp;的转换库。 xsd作为输入以获得正确的JSON结果。
我对您的SQL进行了更正以使其可执行:
<StringOrNumber>12345</StringOrNumber>
<StringOrBoolean>false</StringOrBoolean>
结果如下:
因此,如果你将这个online transformer用于xml到json转换器(当然它不需要xsd进行转换)。它会将您的xml数据转换为json,如下所示:
--Table 1 to store all answers
create Table #ans(qid int, ans varchar(50), aid varchar(10));
insert into #ans values
(1001,'test answer',null),
(1002,null,'a'),
(1003,null,'0'),
(1004,null,'1');
--Table 2 to pivot answers
create table #temp(cid int,[1001] varchar(50),[1002] varchar(10), [1003] bit, [1004] bit);
insert into #temp
select 12345,
max(case when qid = '1001' then a.ans end) as [1001],
max(case when qid = '1002' then a.aid end) as [1002],
max(case when qid = '1003' then a.aid end) as [1003],
max(case when qid = '1004' then a.aid end) as [1004]
from #ans a;
--Doing an XML final select
create table #final (xml_data varchar(max));
insert into #final
select
final_data =
(select
fakedata = 'something..',
question1 = t.[1001],
question2 = t.[1001],
question3 = t.[1003],
question4 = t.[1004]
from #temp t
FOR XML PATH(''));
select * from #ans;
select * from #temp;
select * from #final;
而你需要在xsd以下进行正确的转换:
<root>
<fakedata>something..</fakedata><question1>test answer</question1><question2>test answer</question2><question3>0</question3><question4>1</question4>
</root>
{
"fakedata": "something..",
"question1": "test answer",
"question2": "a",
"question3": "1",
"question4": "0"
}