3

テーブルの列から取得しているxmlに挿入しようとしています。私はそれを次のように取得します:

DECLARE @profiles_xml xml
DECLARE @profile_id int
SET @profile_id = 16
SET @profiles_xml = (SELECT profiles from tbl_applied_profiles WHERE
profiles.value('(Profile/ID)[1]','int')= @profile_id)

結果のxmlは次のようになります。

<Profile>
  <ID>16</ID>
  <User>
    <ID>BC4A18CA-AFB5-4268-BDA9-C990DAFE7783</ID>
    <Name>test</Name>
    <Activities />
  </User>
</Profile>

ただし、次のように要素を挿入しようとすると、次のようになります。

SET @devices_xml.modify('insert <Activity><Name>testname</Name></Activity>
 as first into (Profiles/User/Activities[1])')

次のエラーが発生します。

XQuery [modify()]: The target of 'insert' must be a single node, found 'element(Activities,xdt:untyped) *'

現在、Activities要素が1つしかないため、エラーが発生する理由がわかりません。

4

1 に答える 1

8

2つの小さなエラーがあります。

  • トップレベルのXMLノードは<Profile>-ですがProfiles、挿入XQueryにあります
  • また、コレクションにエントリがない場合やエントリが1つしかない場合でも(指定したXPathは複数のノードを返す可能性があります)、それらのノードの最初のものを取得するように明示的に指示する必要があります。ここでは、[1]インデクサーが間違った場所(クロージング内))にありました。

このXQueryを試してください:

SET @devices_xml.modify('insert <Activity><Name>testname</Name></Activity>
                         as first into (Profile/User/Activities)[1]')

少なくとも私の場合、これはその後返されました:

<Profile>
  <ID>16</ID>
  <User>
    <ID>BC4A18CA-AFB5-4268-BDA9-C990DAFE7783</ID>
    <Name>test</Name>
    <Activities>
      <Activity>
        <Name>testname</Name>
      </Activity>
    </Activities>
  </User>
</Profile>
于 2012-11-05T05:45:06.797 に答える