我需要为表格中的每一行提取不同的<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
答案 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列添加到具有标识的表中。结果将出现在不同的结果集中。要在一个结果集中获取它们,需要创建一个表变量来存储它们。