我需要在T-SQL中解析XML的帮助

The*_*Sky 3 xml t-sql xpath xquery xml-parsing

有人可以帮我解析T-SQL中的以下XML(SQL Server 2005)吗?

<Tx>
    <T>1</T>
    <C>1</C>
    <T>2</T>
    <C>1</C>
    <T>3</T>
    <C>1</C>
    <T>4</T>
    <C>1</C>
</Tx>
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

SELECT
        Tx.query('T').value('.', 'varchar(10)') AS [Column 1],
        Tx.query('C').value('.', 'varchar(10)') AS [Column 2]
    FROM @MyXml.nodes('Tx') x(Tx)
Run Code Online (Sandbox Code Playgroud)

但它没有用,因为我得到以下结果:

Column 1    Column 2
--------    --------
1234        1111
Run Code Online (Sandbox Code Playgroud)

期待(我想要实现的目标):

Column 1    Column 2
--------    --------
1           1
2           1
3           1
4           1
Run Code Online (Sandbox Code Playgroud)

该字符串显然是一个有效的XML,但它对T-SQL有效吗?

如果有人能提供解释XML如何在T-SQL中工作的参考,我将不胜感激.

提前致谢.

Mik*_*son 5

这是一种按位置配对值的方法.第一个T与第一个C匹配,依此类推.

declare @XML xml = 
'<Tx>
    <T>1</T>
    <C>4</C>
    <T>2</T>
    <C>3</C>
    <T>3</T>
    <C>2</C>
    <T>4</T>
    <C>1</C>
</Tx>'

select @XML.value('(/Tx/T[position() = sql:column("N.number")])[1]', 'int') as Column1,
       @XML.value('(/Tx/C[position() = sql:column("N.number")])[1]', 'int') as Column2
from master..spt_values as N
where N.type = 'P' and
      N.number between 1 and @XML.value('max((count(/Tx/T), count(/Tx/C)))', 'int')
Run Code Online (Sandbox Code Playgroud)

有了这样的XML的结构不同建议marc_s查询是简单.

declare @XML xml = 
'<Tx>
  <row>
    <T>1</T>
    <C>4</C>
  </row>
  <row>
    <T>2</T>
    <C>3</C>
  </row>
  <row>
    <T>3</T>
    <C>2</C>
  </row>
  <row>
    <T>4</T>
    <C>1</C>
  </row>
</Tx>'

select T.R.value('T[1]', 'int') as Column1,
       T.R.value('C[1]', 'int') as Column2
from @XML.nodes('/Tx/row') as T(R)
Run Code Online (Sandbox Code Playgroud)