Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server从XML参数到表-使用可选的子节点_Sql Server_Xml_Sql Server 2008_Sql Server 2008 R2 - Fatal编程技术网

Sql server SQL Server从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

在SQLServer2008R2上,我试图将XML值读取为表

到目前为止,我在这里:

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 ) ;