web-dev-qa-db-ja.com

ノードをXMLに更新/挿入/挿入する方法

オプションのサイト情報をXMLフィールドに格納するアプリケーションがあります。

サンプルテーブル:

CREATE TABLE [dbo].[Sites](
    [SiteID] [int] IDENTITY(1,1) NOT NULL,
    [SiteName] [nvarchar](80) NULL,
    [SiteInfo] [xml] NULL );

INSERT INTO [dbo].[Sites] ([SiteName]) VALUES  ('TestSite1') ; 

属性が適用されない場合、XMLフィールドはNULLです。これらの属性のいずれかが適用される場合、アプリケーションはXMLドキュメントと関連ノードを挿入します。

有効な例は次のようになります。

<SiteInfo>
  <BoreID>ABC123</BoreID>
  <ConsentCompliance>true</ConsentCompliance>
</SiteInfo>

別のシステムから一部のデータを移行する必要があるため、このフィールド/ XMLにデータを挿入しようとしています。これまでのところ、私の試みは、アプリが気に入らないシングルトンノードをもたらしました。

私がウェブで見つけたいくつかの例を使用して、私は以下を試しました:

update [dbo].[Sites] 
SET [SiteInfo].modify('insert <Anothernode>ABC123</Anothernode> into (/SiteInfo)') 
where Siteid = 1 

これは次のエラーをスローします:

メッセージ2226、レベル16、状態1、行1 XQuery [dbo.Sites.SiteInfo.modify()]: 'insert'のターゲットは単一のノードでなければならず、 'element(SiteInfo、xdt:untyped)*'が見つかりました

質問:

  1. フィールドがNULLの場合、XMLのベースを挿入するために、つまりフィールドに挿入する前に、まずフィールドを更新する必要がありますか?
  2. 開始と終了のペアを使用しないXMLノードの名前は何ですか。 For example: <BoreID>ABC123</BoreID> vs a single side <BoreID=ABC123/>
  3. SQLを使用してノードをXMLに挿入する他の/より良い方法はありますか?

乾杯

ピート

答え:

  1. はい update [dbo].[Sites] SET [SiteInfo] = '<SiteInfo />'
  2. ショートハンドvsロング
  3. 番号
2

[1]を使用して最初のSiteInfoノードを指定するだけです

update [dbo].[Sites] 
SET [SiteInfo].modify('insert <Anothernode>ABC123</Anothernode> into (/SiteInfo[1])') 
where Siteid = 1 
5
Mister Magoo