如何使用 XQuery/XPath 提取 xml 字符串以在 sql 中创建新列?

How to extract xml string to make a new colums in sql using XQuery/XPath?

你好,我现在有我的代码,但使用这些代码我没有得到正确的结果;

Declare @txt varchar(max) = (
    select audit_val from AuditTable 
    where audit_val like '%update_dt%' 
    and audit_val like '%PEK150700019-001%')

Declare @xml XML = CONVERT(XML,@txt)

SELECT 
    @xml.value('(/i/@guest_id)[1]', 'varchar(100)') as guest_id
    , @xml.value('(/i/@updated_by)[1]', 'varchar(100)') as updated_by
    , @xml.value('(/i/@update_dt)[1]', 'datetime') as update_dt

我得到的是空值,它说它返回了多个值, 使用 select top 1 可以,但是 我需要从 table 行中提取该列所需的所有字符串,有人可以帮我解决这个问题吗?提前致谢:)

注意**这是一个示例输出;

=================================================================
|guest_id          |   updated_by     |     update_dt           |
|==================|==================|=========================|
|PEK150700019-001  |  sherwin         |  2015-08-11T13:59:09.550|
|------------------|------------------|-------------------------|

这是一种可能的方式:

declare @auditTable TABLE(audit_val varchar(1000))
insert into @auditTable values('<i guest_id="PEK150700019-001" updated_by="sherwin" update_dt="2015-08-11T13:59:09.550" place_birth="SHANGHAI"/>')

select 
    (CONVERT(XML,audit_val)).value('(/i/@guest_id)[1]', 'varchar(100)') as guest_id
    , (CONVERT(XML,audit_val)).value('(/i/@updated_by)[1]', 'varchar(100)') as updated_by
    , (CONVERT(XML,audit_val)).value('(/i/@update_dt)[1]', 'datetime') as update_dt
from @auditTable 
where audit_val like '%update_dt%' 
      and audit_val like '%PEK150700019-001%'

Sqlfiddle Demo

首先使用XML数据类型来存储XML数据。这样您就可以避免多次将 varchar 强制转换为 XML,这可能会提高查询性能。

输出:

|         guest_id | updated_by |                update_dt |
|------------------|------------|--------------------------|
| PEK150700019-001 |    sherwin | August, 11 2015 13:59:09 |