微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试使用 SQL Server 中的查询访问表列中的 XML 节点值,但它始终返回空字符串

如何解决尝试使用 SQL Server 中的查询访问表列中的 XML 节点值,但它始终返回空字符串

一个名为 UserRequest 的表,其中一列是 XML 类型(列名是 RequestXML)。 RequestXML 中的值将是这样的:

<MyRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://schemas.datacontract.org/2004/07/">
    <transfer>
        <Field>
            <fieldId>12323</fieldId>
            <FieldDetails>
                <RequestInfoField>
                    <requestDecs>Test</requestDecs>
                    <reqDate>01/01/2021</reqDate>
                </RequestInfoField>
                <identifierKey>45638</identifierKey>
            </FieldDetails>
        </Field>
    </transfer>
</MyRequest>

使用以下 sql 查询检索 identifierKey 的 XML 节点值,但查询始终返回空字符串:

select 
    T.RequestXML.query('MyRequest/transfer/Field/FieldDetails/identifierKey') As identifierKey,* 
from UserRequest  T

解决方法

您尚未在 SQL 中声明您的(默认)命名空间:

WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/')
SELECT UR.RequestXML.query('MyRequest/transfer/Field/FieldDetails/identifierKey') As identifierKey,*
FROM dbo.UserRequest UR;

但是,如果您明确希望 identifierKey 的值使用 value,而不是 query

WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/')
SELECT UR.RequestXML.value('(MyRequest/transfer/Field/FieldDetails/identifierKey)[1]','int') AS identifierKey
       *
FROM dbo.UserRequest UR;

db<>fiddle

,

像这样:

declare @doc xml = '<MyRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://schemas.datacontract.org/2004/07/">
    <transfer>
        <Field>
            <fieldId>12323</fieldId>
            <FieldDetails>
                <RequestInfoField>
                    <requestDecs>Test</requestDecs>
                    <reqDate>01/01/2021</reqDate>
                </RequestInfoField>
                <identifierKey>45638</identifierKey>
            </FieldDetails>
        </Field>
    </transfer>
</MyRequest>';

WITH XMLNAMESPACES(DEFAULT 'http://schemas.datacontract.org/2004/07/')
SELECT T.RequestXML.value('(/MyRequest/transfer/Field/FieldDetails/identifierKey)[1]','int') As identifierKey,*
FROM (values(@doc)) T(RequestXML);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。