【发布时间】:2011-06-24 19:01:14
【问题描述】:
我有这个变量:
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 文件的顺序添加到我的结果中。 (这是 Table1 的第一个实例,然后是第二个......)。
由于SQL table variable limitations 的原因,我不能使用标识列来保持这一点。 (由于其他原因,我不想使用临时表。)
我希望有一个很酷的 SQL XML 函数可以返回某种内部分配的节点 ID。 (或其他类似的排序方式。)
请注意,我不控制此 XML 结构(我只是一个读者),所以我无法更改以添加 ID 属性。
任何建议都会很棒!
编辑/更新:
我真的很想拥有这样的数据:
1 |共享参数 |共享 1 |另一个 |萨赫尔 1 |随机参数2 |好东西 1 |更多参数 |和更多 1 |结果参数 |和更多 2 |随机参数2 |你 2 |更多参数 |思考 2 |结果参数 | 2 3 |共享参数 |最后的 3 |另一个 |放 . . .但我做得不够好。我可以将它放入列(或多或少),但我不知道如何进行编号。如果您有任何想法,我很想听听。
编辑:
我想出了执行此操作的查询(在互联网的帮助下)。它看起来像这样:
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)
【问题讨论】:
标签: sql tsql sql-server-2008 xquery xquery-sql