Sql server SQL Server从XML参数到表-使用可选的子节点
在SQLServer2008R2上,我试图将XML值读取为表 到目前为止,我在这里:Sql server SQL Server从XML参数到表-使用可选的子节点,sql-server,xml,sql-server-2008,sql-server-2008-r2,Sql Server,Xml,Sql Server 2008,Sql Server 2008 R2,在SQLServer2008R2上,我试图将XML值读取为表 到目前为止,我在这里: DECLARE @XMLValue AS XML; SET @XMLValue = '<SearchQuery> <ResortID>1453</ResortID> <CheckInDate>2011-10-27</CheckInDate> <CheckOutDate>2011-11-04</CheckOutD
DECLARE @XMLValue AS XML;
SET @XMLValue = '<SearchQuery>
<ResortID>1453</ResortID>
<CheckInDate>2011-10-27</CheckInDate>
<CheckOutDate>2011-11-04</CheckOutDate>
<Room>
<NumberOfADT>2</NumberOfADT>
<CHD>
<Age>10</Age>
</CHD>
<CHD>
<Age>12</Age>
</CHD>
</Room>
<Room>
<NumberOfADT>1</NumberOfADT>
</Room>
<Room>
<NumberOfADT>1</NumberOfADT>
<CHD>
<Age>7</Age>
</CHD>
</Room>
</SearchQuery>';
SELECT
Room.value('(NumberOfADT)[1]', 'INT') AS NumberOfADT
FROM @XMLValue.nodes('/SearchQuery/Room') AS SearchQuery(Room);
对于我上面提供的XML值,下面的Insert t-sql是合适的:
INSERT INTO @table VALUES(1453, '2011-10-27', '2011-11-04', 2, 2, '10;12');
INSERT INTO @table VALUES(1453, '2011-10-27', '2011-11-04', 1, 0, NULL);
INSERT INTO @table VALUES(1453, '2011-10-27', '2011-11-04', 1, 1, '7');
CHDCount
表示Room
节点下CHD
节点的数量。还有,我有多少Room
节点,这里有多少表行
至于它的外观,请参见下图:
实际上,此代码用于酒店预订搜索查询。所以,我需要
为了处理这些值,我从XML参数中获取了查询表的值
并返回可用的房间。我这么说是因为它可能会有帮助
你们要坚持到底。我不是在寻找一个完整的代码
客房预订系统。那太自私了
这会让你接近:
SELECT ResortID = @xmlvalue.value('(//ResortID)[1]', 'int')
, CheckInDate = @xmlvalue.value('(//CheckInDate)[1]', 'date')
, CheckOutDate = @xmlvalue.value('(//CheckOutDate)[1]', 'date')
, NumberOfAdt = Room.value('(NumberOfADT)[1]', 'INT')
, CHDCount = Room.value('count(./CHD)', 'int')
, CHDAges = Room.query('for $c in ./CHD
return concat(($c/Age)[1], ";")').value('(.)[1]',
'varchar(100)')
FROM @XMLValue.nodes('/SearchQuery/Room') AS SearchQuery ( Room ) ;
@marc_感谢您对标题的点评。我不确定这是一个好标题在这里。如果您能提供更好的标题,请随意更改。您希望目标参数表是什么样的?你关心孩子的信息,还是关心每个房间的ADT数量?NumberofADT是子行的计数吗?您能更清楚地描述所需的输出吗?您需要哪些值以及如何使用它们?@StuartAinsworth感谢您的回答。请参阅更新的问题。@EdHarper感谢您的回答。看更新的问题。你知道你有多棒吗?谢谢!哦;错过页面刷新:)谢谢!如你所见,我已经收到了,但谢谢你的努力:)
select S.X.value('ResortID[1]', 'int') as ResortID,
S.X.value('CheckInDate[1]', 'date') as CheckInDate,
S.X.value('CheckOutDate[1]', 'date') as CheckOutDate,
R.X.value('NumberOfADT[1]', 'int') as NumberOfADT,
R.X.value('count(CHD)', 'int') as CHDCount,
stuff((select ';'+C.X.value('.', 'varchar(3)')
from R.X.nodes('CHD/Age') as C(X)
for xml path('')), 1, 1, '') as CHDAges
from @XMLValue.nodes('/SearchQuery') as S(X)
cross apply S.X.nodes('Room') as R(X)
SELECT ResortID = @xmlvalue.value('(//ResortID)[1]', 'int')
, CheckInDate = @xmlvalue.value('(//CheckInDate)[1]', 'date')
, CheckOutDate = @xmlvalue.value('(//CheckOutDate)[1]', 'date')
, NumberOfAdt = Room.value('(NumberOfADT)[1]', 'INT')
, CHDCount = Room.value('count(./CHD)', 'int')
, CHDAges = Room.query('for $c in ./CHD
return concat(($c/Age)[1], ";")').value('(.)[1]',
'varchar(100)')
FROM @XMLValue.nodes('/SearchQuery/Room') AS SearchQuery ( Room ) ;