Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Намиране на реда на възли в XML документ в SQL Server

Можете да емулирате position() функция чрез преброяване на броя братски възли, предхождащи всеки възел:

SELECT
    code = value.value('@code', 'int'),
    parent_code = value.value('../@code', 'int'),
    ord = value.value('for $i in . return count(../*[. << $i]) + 1', 'int')
FROM @Xml.nodes('//value') AS T(value)

Ето набора от резултати:

code   parent_code  ord
----   -----------  ---
1      NULL         1
11     1            1
111    11           1
12     1            2
121    12           1
1211   121          1
1212   121          2

Как работи:

  • за $i в . клауза дефинира променлива с име $i който съдържа текущия възел (. ). Това е основно хак за заобикаляне на липсата на XQuery на XSLT-подобен current() функция.
  • ../* изразът избира всички братя и сестри (деца на родителя) на текущия възел.
  • <кодът>[. <<$i] предикатът филтрира списъка с братя и сестри до тези, които предхождат (<< ) текущия възел ($i ).
  • Ние count() броя на предишните братя и сестри и след това добавете 1, за да получите позицията. По този начин на първия възел (който няма предишни братя и сестри) се присвоява позиция 1.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ограничете връзка със SQL Server до конкретен IP адрес

  2. Как да инсталирате SQL Server на Mac с VirtualBox

  3. Агрегирана функция в заявка за актуализиране на SQL?

  4. Конкатениране на много редове в един текстов низ с групиране

  5. Рекурсивна заявка на SQL Server