Sql Server XML манипулирование тегами - PullRequest
1 голос
/ 29 сентября 2011

У меня есть что-то вроде XML.

<person>
    <dwelling>
        <street>S</street>
        <city>C</city>
    </dwelling>
    <ssn>123-232-232</ssn>
</person>

Мне нужно преобразовать все имена узлов, скажем, в верхний регистр всех имен тегов. Какой самый быстрый способ достичь этого в SQL Server T-SQL?

Будет ли это ...

  1. строка разделена на <</li>
  2. затем на каждом токене, разделенном на> (на LeftPart и RightPart)
  3. concat "<" function (LeftPart) + ">" + RightPart
  4. объединить элементы из (шаг 3)

Если у вас есть что-то более изящное, я весь в глазах.

Ответы [ 2 ]

4 голосов
/ 29 сентября 2011
declare @xml xml = '
<person id="10">
    <dwelling>
        <street>S</street>
        <city>C</city>
        <emptynode></emptynode>
        <emptynode/>
    </dwelling>
    <ssn>123-232-232</ssn>
</person>
'

;with C(NodeName, NewNodeName) as
(
  select distinct T.N.value('local-name(.)', 'nvarchar(max)'),
                  upper(T.N.value('local-name(.)', 'nvarchar(max)'))
  from @xml.nodes('//*') as T(N)
)  
select @xml = replace(replace(replace(replace(cast(@xml as nvarchar(max)), 
              '<' +NodeName+'/>', '<' +NewNodeName+'/>'), -- Empty node
              '<' +NodeName+' ' , '<' +NewNodeName+' ' ), -- Start node with attribute
              '<' +NodeName+'>' , '<' +NewNodeName+'>' ), -- Start node no attribute
              '</'+NodeName+'>' , '</'+NewNodeName+'>' )  -- End node
from C
0 голосов
/ 29 сентября 2011

Мое решение:

SET ANSI_WARNINGS ON;    
DECLARE @x XML = 
'<person>
    <dwelling>
        <street>A</street>
        <city>AA</city>
    </dwelling>
    <ssn>123-232-001</ssn>    
</person>    
<person>    
    <dwelling>
        <street>B</street>
        <city>BB</city>
    </dwelling>
    <ssn>123-232-002</ssn>
</person>    
<person>    
    <dwelling>
        <street>C</street>
    </dwelling>
    <ssn>123-232-003</ssn>        
</person>    
<person>    
    <dwelling>
        <city>DD</city>        
    </dwelling>
    <ssn>123-232-004</ssn>    
</person>
';

SELECT   T.XmlNode.value('(dwelling/street)[1]','VARCHAR(25)') AS [DWELLING/STREET]
        ,T.XmlNode.value('(dwelling/city)[1]','VARCHAR(25)') AS [DWELLING/CITY]
        ,T.XmlNode.value('(ssn)[1]','VARCHAR(25)') AS SSN
FROM    @x.nodes('/person') T(XmlNode)
FOR XML PATH('PERSON')

Результаты:

<PERSON>
  <DWELLING>
    <STREET>A</STREET>
    <CITY>AA</CITY>
  </DWELLING>
  <SSN>123-232-001</SSN>
</PERSON>
<PERSON>
  <DWELLING>
    <STREET>B</STREET>
    <CITY>BB</CITY>
  </DWELLING>
  <SSN>123-232-002</SSN>
</PERSON>
<PERSON>
  <DWELLING>
    <STREET>C</STREET>
  </DWELLING>
  <SSN>123-232-003</SSN>
</PERSON>
<PERSON>
  <DWELLING>
    <CITY>DD</CITY>
  </DWELLING>
  <SSN>123-232-004</SSN>
</PERSON>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...