从XML中获取存储在varchar中的xml数据

时间:2011-11-24 09:30:27

标签: sql-server xml

我们有一个简单的表(审核日志),我们的(第三方)产品填充了数据。问题是数据似乎是数据的XML序列化,存储在varchar(max())列中。

CREATE TABLE Audit (
    AuditID int IDENTITY, 
    AuditData nvarchar(max) NULL
)

数据AuditData看起来有点像这样:

<DELETED customerId="89" 
    username="alice" 
    firstname="Alice" 
    lastname="WTF" 
    field1="..." 
    field2="..." 
    fieldn="..."
/>

是否有从SQL查询中获取此数据的任何明智方法?例如,假设我想获取customerId为89的所有审计记录。

如果我可以提供帮助,我不想诉诸字符串错误!

-- This is bad:
SELECT AuditID, AuditData
FROM Audit 
WHERE AuditData LIKE '%customerId="89"%'

2 个答案:

答案 0 :(得分:7)

如果AuditData是XML列,则会更容易/更快,但您可以将其强制转换为查询。

select AuditID, AuditData
from Audit
where cast(AuditData as xml).value('(/DELETED/@customerId)[1]', 'int') = 89

Note:这要求AuditData列包含表中所有行的有效XML。 (NULL可以)和SQL Server 2005或更高版本。

如果您想在customerId上过滤,无论根节点名称如何,您都可以使用此名称。

select AuditID, AuditData
from Audit
where cast(AuditData as xml).value('(/*/@customerId)[1]', 'int') = 89

答案 1 :(得分:0)

使用XML进行转换会更容易。以下脚本可以帮助您获得结果。

DECLARE @MyXML XML

SET @MyXML = `<DELETED 
    customerId="89"    
    username="alice" 
    firstname="Alice" 
    lastname="WTF" 
    field1="..." 
    field2="..." 
    fieldn="..."
/>`

SELECT

a.b.value(`'@customerId'`,`'varchar(10)'`) AS customerId

FROM @MyXML.nodes(`'DELETED'`) a(b)

Find More Things