SQL Server:计算Parent中的XML子项

时间:2013-04-11 10:14:24

标签: sql sql-server xml

您好我一直在寻找一种更新sql中生成的xml的方法来添加子节点的数量,并使用SQL将计数添加到父节点

我尝试过各种各样的工作

    SET @xml.modify
    (
       'insert attribute TrCount {count(/XML/Acs/Act/Trs/Tr)} into (./XML/Acts/Act/Trs)'

);

    <XML>
      <Id>12</Id>
      <DateCreated>2013-04-11</DateCreated>
      <Acts AccountCount="4">
        <Act RowID="1>
             <Trs>
                 <Tr RowID="1" />
             </Trs>
         </Act>
         <Act RowID="2">
             <Trs>
                 <Tr RowID="1"  />
                 <Tr RowID="2" />
             </Trs>
          </Act>
          <Act RowID="3">
             <Trs>
                 <Tr RowID="1"/>
             </Trs>
          </Act>
          <Act RowID="4">
             <Trs>
                 <Tr RowID="1" />
                 <Tr RowID="2" />
                 <Tr RowID="3" />
                 <Tr RowID="4" />
                 <Tr RowID="5" />
                 <Tr RowID="6" />
                 <Tr RowID="7" />
           </Trs>
             </Act>
      </Acts>
    </XML>

上面是一个示例,我已经让它给了我一个内部的计数,但我似乎无法计算每个内的每个,所以结果看起来像

    <Act RowID="1>
          <Trs  Trcount="1">
            <Tr RowID="1" />
          </Trs>
        </Act>
        <Act RowID="2">
          <Trs  Trcount="2">
            <Tr RowID="1"  />
            <Tr RowID="2" />
          </Trs>
        </Act>
        <Act RowID="3">
          <Trs Trcount="1">
            <Tr RowID="1"/>
          </Trs>
        </Act>
        <Act RowID="4">
          <Trs Trcount="7">
            <Tr RowID="1" />
            <Tr RowID="2" />
            <Tr RowID="3" />
            <Tr RowID="4" />
            <Tr RowID="5" />
            <Tr RowID="6" />
            <Tr RowID="7" />
          </Trs>

干杯

1 个答案:

答案 0 :(得分:1)

尝试这样的事情,假设每个Act只包含一个Trs

declare @count int = @xml.value('count(/XML/Acts/Act)', 'int'),
        @counter int = 1;

while (@counter <= @count)
begin
    SET @xml.modify ('insert attribute TrCount {count(/XML/Acts/Act[sql:variable("@counter")]/Trs/Tr)} into (/XML/Acts/Act[sql:variable("@counter")]/Trs)[1]');

    set @counter += 1;
end

insert()只能一次修改单例,而不能修改整组节点。