7

次のコードを試しています。しかし、「xml データ型メソッド "modify" の引数 1 は文字列リテラルでなければなりません」というエラーが発生します。たくさん検索しましたが、この問題の解決策が見つかりません

SET @Path = '/@ParentNodeName/@NodeName/child::*'
SET @x.modify('insert attribute status {sql:variable("@status")}
               as first into (' + @Path + ')[1]')
4

2 に答える 2

11

問題は、挿入しようとしている値を含む sql:variable ではありません。変更ステートメントに XPath を含める方法です。そのコマンドをつなぎ合わせることはできません-リテラルを使用する必要があります:

したがって、次を使用する必要があります。

SET @x.modify('insert attribute status {sql:variable("@status")}
               as first into (/Parent/Node/)[1]')

その後、問題なく動作します。

于 2010-04-13T09:21:28.580 に答える
2

このようなものを使用できます-可変部分の使用法を示すだけです。変更呼び出しの一部として実行できるのと同じこと

このような階層があると仮定します

<Root>
     <Elem1/>
         <Parent1/>
              <Separator/>
                  <Child1/>
</Root>

クエリ:-

DECLARE @Root VARCHAR(50)
DECLARE @Entity VARCHAR(50)
DECLARE @ParentNode VARCHAR(50)
DECLARE @Separator VARCHAR(50)
DECLARE @ChildNode VARCHAR(50)


SET @Root = 'Root'
SET @Entity = 'Elem1'
SET @ParentNode = 'Parent1'
SET @Separator = 'separator'
SET @ChildNode = 'Child1'

select Parent.P.value('.', 'varchar(max)') as MyValue, 
T.uniqueId, T.XMLCol
from [XMLTable] as T
cross apply XMLTable.XMLCol.nodes('(/*[local-name()=sql:variable("@Root")]/*[local-name(.)=sql:variable("@Entity")]/*[local-name(.)=sql:variable("@ParentNode")]/*[local-name(.)=sql:variable("@Separator")]/*[local-name(.)=sql:variable("@ChildNode")])[1]')  as Parent(P) 
于 2011-08-15T09:47:44.260 に答える