为每一行拉出特定的xml节点

时间:2012-09-06 16:47:08

标签: sql sql-server xml

我需要为表格中的每一行提取不同的<node>,节点的位置存储在SpecificNode

DECLARE @table TABLE
    (
        XmlValue XML,
        SpecificNode INT
    )

INSERT INTO @table SELECT   '<root><node>Y</node><node>Y</node><node>10</node><node>YARD</node></root>', 3
INSERT INTO @table SELECT   '<root><node>N</node><node>20</node><node>PART</node><node></node><node>PASS</node></root>', 2
INSERT INTO @table SELECT   '<root><node>Y</node><node>30</node><node>FORK</node></root>', 2

我可以拉一个指定的节点,但是当我尝试将其设置为动态时,它会给出错误“xml数据类型方法的参数1”值“必须是字符串文字。”

SELECT  
    XmlValue.value('(/root/node)['+SpecificNode+']', 'VARCHAR(100)')
FROM @table AS tbl

与此相同的错误

SELECT
    x.value,
    XmlValue.value(x.value, 'VARCHAR(100)')
FROM @table AS tbl
CROSS APPLY (SELECT '(/root/node)['+CONVERT(VARCHAR, SpecificNode)+']' as value) X

我的预期输出是

10
20
30

2 个答案:

答案 0 :(得分:3)

您可以使用sql:column

SELECT
  XmlValue.value('(/root/node[sql:column("SpecificNode")])[1]', 'VARCHAR(100)')
FROM @table AS tbl

答案 1 :(得分:0)

希望这有效。

创建表#table     (         ID INT IDENTITY,         XmlValue XML,         SpecificNode INT     )

INSERT INTO #table SELECT&#39;&lt; root&gt;&lt; node&gt; Y&lt; / node&gt;&lt; node&gt; Y&lt; / node&gt;&lt; node&gt; 10&lt; / node&gt;&lt; node&gt; YARD&lt; /节点&gt;&lt; / root&gt;&#39;,3

INSERT INTO #table SELECT&#39;&lt; root&gt;&lt; node&gt; N&lt; / node&gt;&lt; node&gt; 20&lt; / node&gt;&lt; node&gt; PART&lt; / node&gt;&lt; node&gt;&lt; /节点&gt;&lt;节点&gt; PASS&lt; / node&gt;&lt; / root&gt;&#39;,2

INSERT INTO #table SELECT&#39;&lt; root&gt;&lt; node&gt; Y&lt; / node&gt;&lt; node&gt; 30&lt; / node&gt;&lt; node&gt; FORK&lt; / node&gt;&lt; / root&gt;&# 39;,2

声明@a varchar(1000),@ IDENT INT; 将@values声明为表(值INT)

SET @IDENT = 1

DECLARE CUR CURSOR for select &#39; SELECT
    XmlValue.value(&#39;&#39;(/ root / node)[&#39; + CONVERT(VARCHAR(10),SpecificNode)+&#39;]&#39;&#39;,&# 39;&#39; VARCHAR(100)&#39;&#39;) FROM #table AS tbl WHERE ID =&#39;

来自#table

OPEN CUR

FETCH NEXT FROM CUR INTO @A

WHILE @@ FETCH_STATUS = 0

BEGIN

SET @A = @A + CONVERT(VARCHAR(10),@ IDENT)

INSERT INTO @values(value)     执行(@A)

SET @IDENT = @IDENT + 1

FETCH NEXT FROM CUR INTO @A

END

CLOSE CUR

DEALLOCATE CUR

DROP TABLE #table SELECT * fROM @values

需要做出一些额外的努力。首先将表变量更改为临时表,然后将ID列添加到具有标识的表中。结果将出现在不同的结果集中。要在一个结果集中获取它们,需要创建一个表变量来存储它们。