用SQL提取XML数据

用SQL提取XML数据,sql,xml,stored-procedures,Sql,Xml,Stored Procedures,我将以下XML数据存储在SQL表中 <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 fieldNam

我将以下XML数据存储在SQL表中

<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="ChangeRequest">No</Field>
<Field fieldName="ProblemRecord">No</Field>
<Field fieldName="Source">Email</Field>
<Field fieldName="KB_Article">No</Field>
<Field fieldName="OptimusRef">264692</Field>
<Field fieldName="TimeSpentOnTicket">0.25</Field>
<Field fieldName="PONumber" />
<Field fieldName="ResourceAssignedEngineer" />

不
不
电子邮件
不
264692
0.25

我想做的是从存储过程中选择TimePentonicket值


有什么办法吗?

这里的问题是XML。它是无效的,所以在修复它之前,没有真正的方法来搜索它。检查这一点的一个简单方法是使用在线工具,如。我看到的另一个问题是您引用的名称空间(xmlns)不再存在。我想这也会把博士后搞得一团糟,但我不是100%同意。你可能需要在吞食时过滤掉它。但是,在修复XML之后,在适当的范围内使用它可以很容易地将内容导出

例如,使用下表:

CREATE TABLE BLA.TEMPTABLE (ID INT, MYXML XML)
然后,插入XML的有效版本:

INSERT INTO BLA.TEMPTABLE ( ID, MYXML )
SELECT 1 as ID, 
    '<?xml version="1.0" encoding="UTF-8"?>
    <CustomFields>
        <Field fieldName="ChangeRequest">No</Field>
        <Field fieldName="ProblemRecord">No</Field>
        <Field fieldName="Source">Email</Field>
        <Field fieldName="KB_Article">No</Field>
        <Field fieldName="OptimusRef">264692</Field>
        <Field fieldName="TimeSpentOnTicket">0.25</Field>
        <Field fieldName="PONumber" />
        <Field fieldName="ResourceAssignedEngineer" />
    </CustomFields>' as MYXML

顺便说一句,XPATH返回一个数组,因此如果您只需要数组中的第一个值,您可以从BLA.tentable执行如下操作
SELECT ID,MYXML,(XPATH('/CustomFields//Field[@fieldName=''timesponticket']/text(),MYXML))[1]
SELECT
    tt.ID, 
    tt.MYXML,
    XPATH('/CustomFields//Field[@fieldName=''TimeSpentOnTicket'']/text()', tt.MYXML)
FROM
    BLA.TEMPTABLE tt