【问题标题】:Trying to access an XML node value from a table column using query in SQL Server and it always returns an empty string尝试使用 SQL Server 中的查询从表列访问 XML 节点值,它总是返回一个空字符串
【发布时间】:2021-07-03 06:49:01
【问题描述】:

有一个名为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 查询检索 XML 节点值identifierKey,但查询始终返回空字符串:

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

【问题讨论】:

    标签: sql sql-server xml tsql sql-server-2012


    【解决方案1】:

    您尚未在 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

    【讨论】:

    【解决方案2】:

    像这样:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      相关资源
      最近更新 更多