Sql server 如何查询格式不正确的XML字段?

Sql server 如何查询格式不正确的XML字段?,sql-server,xml,tsql,sql-server-2008-r2,Sql Server,Xml,Tsql,Sql Server 2008 R2,下面的xml属于一个xml列AuditData。我想查询所有包含“Blondie”的记录 <AuditText Username="Blondie" CustomerGUID="xxxxxxxxxx3C4B35821FC0" IPAddress="xx.xxx.xxx.xx" /> 我想有几个AuditText节点,其中一些属于Blondie 您可以分解完整的XML,并使用类似于表的数据在经典的WHERE子句中使用like对其进行过滤。但更好的是XQuery。最好使用.nodes(

下面的xml属于一个xml列AuditData。我想查询所有包含“Blondie”的记录

<AuditText Username="Blondie" CustomerGUID="xxxxxxxxxx3C4B35821FC0" IPAddress="xx.xxx.xxx.xx" />

我想有几个AuditText节点,其中一些属于Blondie

您可以分解完整的XML,并使用类似于表的数据在经典的
WHERE
子句中使用
like
对其进行过滤。但更好的是
XQuery
。最好使用
.nodes()
方法,但也可以使用
.query()
甚至
.value()
方法

在本例中,我添加了一个根节点和几个测试节点:

DECLARE @xml XML=
'<root>
<AuditText Username="Blondie" CustomerGUID="xxxxxxxxxx3C4B35821FC0" IPAddress="xx.xxx.xxx.xx" />
<AuditText Username="Test1" CustomerGUID="xxxxxxxxxx11111111" IPAddress="xx.xxx.111.11" />
<AuditText Username="Blondie" CustomerGUID="xxxxxxxxxx3C4B35821FC0" IPAddress="xx.xxx.xxx.xx" />
<AuditText Username="Test2" CustomerGUID="xxxxxxxxxx222222222" IPAddress="xx.xxx.222.22" />
</root>
';

SELECT Blondie.value('@CustomerGUID','varchar(max)') AS CustomerGuid --you might set the type to "uniqueidentifier", if the value is a valid GUID
FROM @xml.nodes('/root/AuditText[@Username="Blondie"]') AS Only(Blondie);

--This is the way to insert your search string via variable
DECLARE @Username VARCHAR(100)='Test1';
SELECT MyUser.value('@CustomerGUID','varchar(max)')
FROM @xml.nodes('/root/AuditText[@Username=sql:variable("@Username")]') AS Only(MyUser);
最后,如果您的XML格式不好,您可以使用

WHERE CAST(AuditData AS VARCHAR(MAX)) LIKE '%Blondie%'
或者(更准确一点)


我想有几个AuditText节点,其中一些属于Blondie

您可以分解完整的XML,并使用类似于表的数据在经典的
WHERE
子句中使用
like
对其进行过滤。但更好的是
XQuery
。最好使用
.nodes()
方法,但也可以使用
.query()
甚至
.value()
方法

在本例中,我添加了一个根节点和几个测试节点:

DECLARE @xml XML=
'<root>
<AuditText Username="Blondie" CustomerGUID="xxxxxxxxxx3C4B35821FC0" IPAddress="xx.xxx.xxx.xx" />
<AuditText Username="Test1" CustomerGUID="xxxxxxxxxx11111111" IPAddress="xx.xxx.111.11" />
<AuditText Username="Blondie" CustomerGUID="xxxxxxxxxx3C4B35821FC0" IPAddress="xx.xxx.xxx.xx" />
<AuditText Username="Test2" CustomerGUID="xxxxxxxxxx222222222" IPAddress="xx.xxx.222.22" />
</root>
';

SELECT Blondie.value('@CustomerGUID','varchar(max)') AS CustomerGuid --you might set the type to "uniqueidentifier", if the value is a valid GUID
FROM @xml.nodes('/root/AuditText[@Username="Blondie"]') AS Only(Blondie);

--This is the way to insert your search string via variable
DECLARE @Username VARCHAR(100)='Test1';
SELECT MyUser.value('@CustomerGUID','varchar(max)')
FROM @xml.nodes('/root/AuditText[@Username=sql:variable("@Username")]') AS Only(MyUser);
最后,如果您的XML格式不好,您可以使用

WHERE CAST(AuditData AS VARCHAR(MAX)) LIKE '%Blondie%'
或者(更准确一点)

(a) 您显示的XML格式良好。所以我不明白你文章的标题。(b) 永远不要告诉我们某些东西“不起作用”,而不告诉我们它是如何失败的。这就像在没有解释症状的情况下告诉医生你感觉不舒服。(a)你显示的XML格式良好。所以我不明白你文章的标题。(b) 永远不要告诉我们某些东西“不起作用”,而不告诉我们它是如何失败的。这就像在没有解释症状的情况下告诉医生你感觉不舒服。
WHERE CAST(AuditData AS VARCHAR(MAX)) LIKE '% Username="Blondie"%'