Прежде всего, это не действительный XML:
<EMPLOYEE ID= 102>
<PERIOD>AUG-2010</PERIOD>
<earnings>
<title>BASIC</title>
<amount>2000</amount>
<title>HRA</title>
<amount>800</amount>
<title>CONVEYANCE</title>
<amount>5000</amount>
</earnings>
</EMPLOYEE>
За атрибутом ID=
должны немедленно следовать данные - предпочтительно в двойных кавычках - это действительно:
<EMPLOYEE ID="102">
Далее: тот факт, что у вас есть несколько пар тегов <title>..</title><amount>...</amount>
внутри тега <earnings>
без контейнера вокруг них, делает анализ почти невозможным (или действительно грязным) .....
<earnings>
<title>BASIC</title>
<amount>2000</amount>
<title>HRA</title>
<amount>800</amount>
<title>CONVEYANCE</title>
<amount>5000</amount>
</earnings>
Если возможно, попробуйте изменить это на что-то вроде этого:
<earnings>
<earning>
<title>BASIC</title>
<amount>2000</amount>
</earning>
<earning>
<title>HRA</title>
<amount>800</amount>
</earning>
<earning>
<title>CONVEYANCE</title>
<amount>5000</amount>
</earning>
</earnings>
Это было бы намного проще обрабатывать!
Если выУ был этот дополнительный <earning>
контейнер, который включает в себя пару <title>/<amount>
, тогда вы могли бы легко написать этот оператор XQuery и полностью обработать все ваши потребности без грязных, медленных курсоров:
SELECT
RootData.Employee.value('(@ID)[1]', 'int') AS 'EmployeeID',
E.E2.value('(title)[1]', 'varchar(50)') AS 'Title',
E.E2.value('(amount)[1]', 'decimal(18,4)') AS 'Amount'
from
(your XML column).nodes('/root/EMPLOYEE') AS RootData(Employee)
CROSS APPLY
RootData.Employee.nodes('earnings/earning') AS E(E2)
и вы получите что-то вроде этого:
EmployeeID Title Amount
100 BASIC 2000.0000
100 HRA 1000.0000
100 CONVEYANCE 500.0000
101 BASIC 2000.0000
101 HRA 400.0000
101 CONVEYANCE 500.0000
102 BASIC 2000.0000
102 HRA 800.0000
102 CONVEYANCE 5000.0000