SQL Server 查询元素值的 xml 属性

Posted

技术标签:

【中文标题】SQL Server 查询元素值的 xml 属性【英文标题】:SQL Server query xml attribute for an element value 【发布时间】:2012-10-06 11:53:20 【问题描述】:

对不起,如果这是在其他地方,我发现了很多类似的例子,但我无法让它与我的数据一起工作。 2天后,我需要一个答案:(

基本上有一个 SQL Server 表,其中包含一个包含 XML 数据的列。此数据包含我需要提取的值。

这是我的 XML。

  <CustomFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.kaseya.com/vsa/2007/12/ServiceDeskDefinition.xsd">
    <Field fieldName="AutoCategory">Event Log</Field>
    <Field fieldName="SType">Event Log</Field>
    <Field fieldName="STag1">AgentGuid</Field>
    <Field fieldName="STag2">AlertRegistrationId</Field>
    <Field fieldName="STag3">LogType</Field>
    <Field fieldName="SValue1">619764177412541</Field>
    <Field fieldName="SValue2">104</Field>
    <Field fieldName="SValue3">1380569194</Field>
    <Field fieldName="SdTicketId">RPSv1006330</Field>
    <Field fieldName="AgentName">bla bla</Field>
    <Field fieldName="MachineGroupGuid">86115414719112271316891312</Field>
    <Field fieldName="OrgFk">59165166782128125214185317</Field>
    <Field fieldName="GuidAgent">619764177412541</Field>
    <Field fieldName="AlertCount">0</Field>
    <Field fieldName="TicketTitle">bla bla</Field>
    <Field fieldName="LegacyId">152262</Field>
    <Field fieldName="LegacyRef">152262</Field>
    <Field fieldName="CwStatus">2</Field>
    <Field fieldName="CwTicketId">89495</Field>
</CustomFields>

我需要能够提取与CwTicketId 字段名称关联的值。

所以本质上,我想通过 XML 查找具有 fieldName = "CwTicketId" 的节点并返回 89495 或等效值。

下面是我自己提出的代码,它提取值,但问题是有时 XML 的排序不同,所以值并不总是在我指定的行上,因此它返回准确的数据.

;WITH XMLNAMESPACES(DEFAULT N'http://www.kaseya.com/vsa/2007/12/ServiceDeskDefinition.xsd')
SELECT 
    ref as ServiceDeskID, 
    sdSummary as ServiceDeskSummary,
    customFields.value('(/CustomFields/Field/node())[17]', 'varchar(100)') as LegacyIDTicketing,
    customFields.value('(/CustomFields/Field/node())[19]', 'varchar(100)') as CWIDTicketing
FROM 
    [ksubscribers].[kasadmin].[SDIncident]

我也需要第二个值,但如果我能弄清楚如何提取一个值,我可以复制另一个值。

希望有人能帮忙,因为我已经开始扯头发了!

感谢您的帮助!

【问题讨论】:

【参考方案1】:
;WITH XMLNAMESPACES(DEFAULT N'http://www.kaseya.com/vsa/2007/12/ServiceDeskDefinition.xsd')
select
    T.C.value('data(.)', 'nvarchar(128)')
from [YOUR_TABLE] as Y
    outer apply Y.[YOUR_XML_COLUMN].nodes('/CustomFields/Field[@fieldName="CwTicketId"]') as T(C)

【讨论】:

您好 Roman,非常感谢您的快速回复。你能帮我理解如何使用它吗?目前我直接从记录中提取 XML,我不了解 T.C.value 和 @XML.nodes。 Appologies,但我是一个完整的 SQL 菜鸟。 我认为我不能比 msdn 更好地解释 :) 基本上您需要阅读有关从 SQL 读取 XML 的内容。您还需要阅读有关 xpath 和 xquery 的信息 - 您需要它来从 XML 中读取数据。我稍微更改了一个查询 - 就像您在此表中有一个表和 xml 列 感谢 Roman,您的更改足以让我开始工作!【参考方案2】:

试试这个:

;WITH XMLNAMESPACES(DEFAULT N'http://www.kaseya.com/vsa/2007/12/ServiceDeskDefinition.xsd')
SELECT 
    ref as ServiceDeskID, 
    sdSummary as ServiceDeskSummary,
    CwTicketID = customFields.value('(/CustomFields/Field[@fieldName="CwTicketId"]/text())[1]', 'int')
FROM  
   [ksubscribers].[kasadmin].[SDIncident]

这选择了具有CwTicketId 作为其字段名称属性的&lt;Field&gt; 节点 - 这将始终有效,无论 XML 及其节点如何排序(只要 fieldName 保持CwTicketId)。

【讨论】:

谢谢马克,你的也很好用!这个网站的速度和质量给我们留下了深刻的印象!

以上是关于SQL Server 查询元素值的 xml 属性的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server XML 列上的 Where 子句过滤属性 AND 值

SQL Server 使用通用字段元素生成 XML

是否可以在 SQL Server 中查询空扩展属性?

Wordpress 自定义 SQL 以获取三个具有给定元值的帖子

如何检索 sql server 内联表值函数的返回值的元数据?

sql server如何用print语句输出查询结果