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データ型メソッド「value」の引数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

これがうまくいくことを願っています。

CREATEテーブル#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)、@IDENTINTを宣言します。@valuesをテーブルとして宣言します(値INT)

SET @IDENT = 1

select'SELECT
XmlValue.value(''(/ root / node)[' + CONVERT(VARCHAR(10)、SpecificNode)+']''、''VARCHAR(100)'')FROM#tableASのカーソルを宣言しますtbl WHERE ID = '

#tableから

OPEN CUR

カーから@Aへの次のフェッチ

WHILE @@ FETCH_STATUS = 0

始める

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

INSERT INTO @values(value)EXEC(@A)

SET @IDENT = @IDENT + 1

FETCH NEXT FROM CUR INTO @A

終わり

クローズカー

DEALLOCATE CUR

DROP TABLE #table SELECT * fROM @values

いくつかの追加の努力が必要でした。最初にテーブル変数を一時テーブルに変更し、次にID列をIDを持つテーブルに追加します。結果は異なる結果セットになります。それらすべてを1つの結果セットで取得するには、それらを格納するためのテーブル変数を作成する必要があります。

于 2012-09-06T17:40:50.803 に答える