尝试使用 SQL 服务器中的查询从 table 列访问 XML 节点值,它总是 returns 一个空字符串

Trying to access an XML node value from a table column using query in SQL Server and it always returns an empty string

有一个名为 UserRequest 的 table,其中一列是 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);