1

我需要为<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
4

2 回答 2

3

您可以使用sql:column

SELECT
  XmlValue.value('(/root/node[sql:column("SpecificNode")])[1]', 'VARCHAR(100)')
FROM @table AS tbl
于 2012-09-06T18:02:06.620 回答
0

希望这有效。

创建表#table(ID INT IDENTITY、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></根>', 2

INSERT INTO #table SELECT '<root><node>Y</node><node>30</node><node>FORK</node></root>', 2

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

设置@IDENT = 1

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

来自#table

打开 CUR

从 CUR 获取下一个到 @A

而@@FETCH_STATUS = 0

开始

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

插入到 @values(value) 执行 (@A)

SET @IDENT = @IDENT + 1

FETCH NEXT FROM CUR INTO @A

结尾

关闭当前

取消分配 CUR

DROP TABLE #table SELECT * fROM @values

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

于 2012-09-06T17:40:50.803 回答