如何更新/插入/注入节点到 XML

Sir*_*lot 4 sql-server-2008 xml insert

我有一个应用程序,它在 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') ; 
Run Code Online (Sandbox Code Playgroud)

如果没有应用属性,则 XML 字段为 NULL。如果这些属性中的任何一个确实适用,则应用程序会插入一个 XML 文档和相关节点。

一个有效的例子如下所示:

<SiteInfo>
  <BoreID>ABC123</BoreID>
  <ConsentCompliance>true</ConsentCompliance>
</SiteInfo>
Run Code Online (Sandbox Code Playgroud)

我需要从另一个系统迁移一些数据,所以我试图将数据插入到这个字段/XML 中。到目前为止,我的尝试导致了应用程序不喜欢的单例节点。

使用我在网上找到的一些示例,我尝试了以下操作:

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

这会引发以下错误:

消息 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. 速记与长

Mis*_*goo 9

您只需要使用 [1] 指定第一个 SiteInfo 节点

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