0

WHILE ループを記述し、変数を xml クエリに渡す必要があります。

このロジックを考えると:

DECLARE @count INT = 0;
DECLARE @pointer INT = 0;
DECLARE @pointer_str varchar(100);

DECLARE @MyXML XML
SET @MyXML = '<SampleXML>
                <Colors>
                <Color1>White</Color1>
                <Color2>Blue</Color2>
                <Color3>Black</Color3>
                <Color4 Special="Light">Green</Color4>
                <Color5>Red</Color5>
                </Colors>
                <Colors>
                <Color1>White</Color1>
                <Color2>Blue</Color2>
                <Color3>Black</Color3>
                <Color4 Special="Light">Green</Color4>
                <Color5>Red</Color5>
                </Colors>
            </SampleXML>'

SET @count = 
    (
        SELECT
            a.b.value('count(/SampleXML/Colors)', 'int')
        FROM 
            @MyXML.nodes('data') a(b)
    )

WHILE @count < @pointer
    BEGIN   
        SELECT
            a.b.value('Colors[' + @pointer + ']/Color1[1]','varchar(10)') AS Color1
        FROM 
            @MyXML.nodes('SampleXML') a(b);

        SELECT @pointer = @pointer + 1;
    END 

XML を解析するために SELECT ステートメントで次の変数を取得しようとしていますが、次のエラーが表示されます。

The argument 1 of the XML data type method "value" must be a string literal.

また、「1」のリテラル値を渡すと、選択がループ内で実行されていることがわかりません。誰かが私を助けてくれますか?

4

1 に答える 1

1

WHILE ループを記述し、変数を xml クエリに渡す必要があります。

varNameXML.value() メソッドでは、変数を として参照できますsql:variable("@varName")

あなたの質問に関してColor1は、XML のノード内のテキストを抽出しようとしているように見えました。次の SQL はそれを行います。

DECLARE @count INT = 0;
DECLARE @pointer INT = 0;
DECLARE @pointer_str varchar(100);

DECLARE @MyXML XML
SET @MyXML = '<SampleXML>
        <Colors>
        <Color1>White</Color1>
        <Color2>Blue</Color2>
        <Color3>Black</Color3>
        <Color4 Special="Light">Green</Color4>
        <Color5>Red</Color5>
        </Colors>
        <Colors>
        <Color1>Green</Color1>
        <Color2>Blue</Color2>
        <Color3>Black</Color3>
        <Color4 Special="Light">Green</Color4>
        <Color5>Red</Color5>
        </Colors>
    </SampleXML>'

SELECT @count = count(a.b.query('.')) FROM @MyXml.nodes('/SampleXML/Colors') as a(b)

SELECT
    a.b.value('.', 'varchar(10)')
FROM 
    @MyXML.nodes('/SampleXML/Colors/Color1') a(b);

次のように出力を生成します

----------
White
Green

(2 row(s) affected)
于 2012-09-25T17:57:19.267 に答える