【问题标题】:How to extract values from a XML column in SQL and insert into new columns?如何从 SQL 中的 XML 列中提取值并插入到新列中?
【发布时间】:2020-05-08 07:59:19
【问题描述】:

我有一个表,其中有一列是 XML 列。我可以使用它从 xml 中获取一些值:

Select TOP 10 
    mq.Id
    , m.c.value('.', 'varchar(64)') as VisitId
    , n.c.value('.', 'varchar(64)') as VisitorId
    , p.c.value('.', 'varchar(64)') as SearchId
from [Message] as mq
    outer apply mq.ActivityLoggingData.nodes('ActivityLoggingData/VisitId') as m(c)
    outer apply mq.ActivityLoggingData.nodes('ActivityLoggingData/VisitorId') as n(c)
    outer apply mq.ActivityLoggingData.nodes('ActivityLoggingData/SearchId') as p(c)

xml类似于:

<ActivityLoggingData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <VisitId>c751de63-1305-4a5a-903e-677b5923d2c2</VisitId>
  <VisitorId>750b76eb-4727-4eb1-9737-cc7ce206e56b</VisitorId>
  <SearchId>baef33dc-8827-42a5-b2bd-a60ffe71aea8</SearchId>
  ...
</ActivityLoggingData>

现在,我在表 [Message] 中添加了列:VisitId、VisitorId 和 SearchId。

我的问题是:如何从 xml 列中提取这些值并插入到这些新列中? table Message 有一个 Id 列,我们可以使用它并将这些值先插入到 temp 表中,然后更新 [Message]。但是,有没有办法在不使用临时表的情况下做到这一点?

数据库是 SQL Server。

谢谢

【问题讨论】:

  • 你在找这个吗? update mq set VisitId = m.c.value('.', 'varchar(64)'), VisitorId = n.c.value('.', 'varchar(64)'), SearchId =p.c.value('.', 'varchar(64 )') 来自 [Message] 作为 mq 外部应用 mq.ActivityLoggingData.nodes('ActivityLoggingData/VisitId') 作为 m(c) 外部应用 mq.ActivityLoggingData.nodes('ActivityLoggingData/VisitorId') 作为 n(c) 外部应用 mq .ActivityLoggingData.nodes('ActivityLoggingData/SearchId') as p(c);

标签: sql sql-server


【解决方案1】:

请检查一下。

DECLARE @xmldata XML = N'<ActivityLoggingData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <VisitId>c751de63-1305-4a5a-903e-677b5923d2c2</VisitId>
  <VisitorId>750b76eb-4727-4eb1-9737-cc7ce206e56b</VisitorId>
  <SearchId>baef33dc-8827-42a5-b2bd-a60ffe71aea8</SearchId>
</ActivityLoggingData>'

DECLARE @T TABLE(VisitId nvarchar(50), VisitorId nvarchar(50), SearchId nvarchar(50))

INSERT INTO @T(VisitId, VisitorId, SearchId)
SELECT x.value(N'(VisitId)[1]', N'nvarchar(50)'),
       x.value(N'(VisitorId)[1]', N'nvarchar(50)'),
       x.value(N'(SearchId)[1]', N'nvarchar(50)')
  FROM @xmldata.nodes(N'/ActivityLoggingData') AS XTbl(x)

SELECT * 
  FROM @T

【讨论】:

  • 因为这些确实是 GUID,所以也可以使用 T-SQL 数据类型 uniqueidentifier(而不是 nvarchar(50))。但是您的解决方案绝对可以正常工作
  • 有没有办法只使用 ONE UPDATE 来更新原始表,而不是使用临时表/表变量来保存提取的值?
  • 我不确定我是否理解您的问题。能否请您举例说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
相关资源
最近更新 更多