我们有一个简单的表(审核日志),我们的(第三方)产品填充了数据。问题是数据似乎是数据的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"%'
答案 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)
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)