如何使用 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%'
首先使用XML
数据类型来存储XML数据。这样您就可以避免多次将 varchar 强制转换为 XML,这可能会提高查询性能。
输出:
| guest_id | updated_by | update_dt |
|------------------|------------|--------------------------|
| PEK150700019-001 | sherwin | August, 11 2015 13:59:09 |
你好,我现在有我的代码,但使用这些代码我没有得到正确的结果;
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%'
首先使用XML
数据类型来存储XML数据。这样您就可以避免多次将 varchar 强制转换为 XML,这可能会提高查询性能。
输出:
| guest_id | updated_by | update_dt |
|------------------|------------|--------------------------|
| PEK150700019-001 | sherwin | August, 11 2015 13:59:09 |