У меня есть эта переменная:
declare @xmlDoc XML
в нем хранится следующий xml:
<?xml version="1.0" encoding="utf-8"?>
<NewDataSet>
<Table1>
<Sharedparam>shared</Sharedparam>
<Antoher>sahre</Antoher>
<RandomParam2>Good stuff</RandomParam2>
<MoreParam>and more</MoreParam>
<ResultsParam>2</ResultsParam>
</Table1>
<Table1>
<RandomParam2>do you</RandomParam2>
<MoreParam>think</MoreParam>
<ResultsParam>2</ResultsParam>
</Table1>
<Table1>
<Sharedparam>Last</Sharedparam>
<Antoher> Set </Antoher>
<RandomParam2> of </RandomParam2>
<MoreParam>values</MoreParam>
<ResultsParam>are here</ResultsParam>
</Table1>
<Table1 />
</NewDataSet>
У меня есть этот запрос, который я использую для получения данных:
declare @xmlDoc XML
set @xmlDoc = '' -- Stack Overflow could not handle the xml all on one line.
SELECT -- Param 1
TBL.SParam.value('local-name((*)[1])', 'varchar(50)') as Param1Name,
TBL.SParam.value('(*)[1]', 'varchar(100)') as Param1Value,
-- Param2
TBL.SParam.value('local-name((*)[2])', 'varchar(50)') as Param2Name,
TBL.SParam.value('(*)[2]', 'varchar(100)') as Param2Value,
-- Param3
TBL.SParam.value('local-name((*)[3])', 'varchar(50)') as Param3Name,
TBL.SParam.value('(*)[3]', 'varchar(100)') as Param3Value,
-- Param 4
TBL.SParam.value('local-name((*)[4])', 'varchar(50)') as Param4Name,
TBL.SParam.value('(*)[4]', 'varchar(100)') as Param4Value,
-- Param 5
TBL.SParam.value('local-name((*)[5])', 'varchar(50)') as Param5Name,
TBL.SParam.value('(*)[5]', 'varchar(100)') as Param5Value
FROM @xmldoc.nodes('/NewDataSet/Table1') AS TBL(SParam)
Мне нужен способ добавить в мои результаты порядок, который они пришли из XML-файла. (Который был первым экземпляром Таблицы 1, затем вторым ....).
По причинам ограничения переменных таблицы SQL , я не могу использовать столбец идентификаторов, чтобы сохранить это прямо. (По другим причинам я не хочу использовать временную таблицу.)
Я надеюсь, что есть классная функция SQL XML, которая будет возвращать какой-то внутренний идентификатор узла. (Или какой-то другой подобный способ заказа.)
Обратите внимание, я не контролирую эту структуру XML (я только читатель), поэтому я не могу вносить изменения для добавления в атрибут ID.
Любой совет был бы великолепен!
EDIT / Update:
Мне бы очень хотелось, чтобы эти данные были такими:
1 | SharedParam | shared
1 | Antoher | sahre
1 | RandomParam2 | Good stuff
1 | MoreParam | and more
1 | ResultsParam | and more
2 | RandomParam2 | do you
2 | MoreParam | think
2 | ResultsParam | 2
3 | Sharedparam | Last
3 | Antoher | Set
.
.
.
Но я подойду. Я могу получить его в столбцы (более или менее), но я не знаю, как сделать нумерацию. Если у вас есть идеи, я бы хотел их услышать.
EDIT:
Я понял запрос, чтобы сделать это (с некоторой помощью из Интернета). Это выглядит так:
SELECT TBL.SParam.value('local-name(.)[1]', 'varchar(50)') as ParamName,
TBL.SParam.value('(.)[1]', 'varchar(50)') ParamValue,
TBL.SParam.value('for $s in . return count(../*[. << $s]) + 1', 'int') ParamPosition,
TBL.SParam.value('for $s in . return count(../../*[. << $s]) - 1', 'int') ParamIteration
FROM @xmldoc.nodes('/NewDataSet/Table1/*') AS TBL(SParam)