You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XQuery命名空间错误:XML发票数据插入SQL Server存储过程问题

解决SQL Server解析XML发票时的ns0命名空间识别错误(Msg 2229)

错误原因

你的XML发票数据使用了ns0命名空间前缀,但存储过程中未通过WITH XMLNAMESPACES声明该前缀对应的实际命名空间URI,导致SQL Server无法识别ns0,触发Msg 2229错误。

核心解决方案

在所有涉及XML节点查询的SQL块前,添加WITH XMLNAMESPACES声明,确保前缀与URI的映射和XML文档中的定义完全一致。

修改后的存储过程示例

CREATE PROCEDURE dbo.EDI_ProcessInboundInvoices
    @XmlInput XML
AS
BEGIN
    SET NOCOUNT ON;

    -- 声明XML命名空间:替换为你的XML中ns0对应的实际URI
    WITH XMLNAMESPACES ('http://your-actual-namespace-uri' AS ns0)
    BEGIN
        -- 批量插入发票表头数据
        INSERT INTO EDIInboundInvoiceHeader (InvoiceNumber, VendorId, InvoiceDate, TotalAmount)
        SELECT
            inv.value('(ns0:InvoiceNumber/text())[1]', 'NVARCHAR(50)'),
            inv.value('(ns0:VendorId/text())[1]', 'INT'),
            inv.value('(ns0:InvoiceDate/text())[1]', 'DATE'),
            inv.value('(ns0:TotalAmount/text())[1]', 'DECIMAL(18,2)')
        FROM @XmlInput.nodes('/ns0:InvoiceBatch/ns0:Invoice') AS InvoiceNodes(inv);

        -- 批量插入发票行项目数据(关联表头主键)
        INSERT INTO EDIInboundInvoiceLineItems (InvoiceId, LineItemNumber, ProductCode, Quantity, UnitPrice)
        SELECT
            h.InvoiceId,
            line.value('(ns0:LineItemNumber/text())[1]', 'INT'),
            line.value('(ns0:ProductCode/text())[1]', 'NVARCHAR(50)'),
            line.value('(ns0:Quantity/text())[1]', 'INT'),
            line.value('(ns0:UnitPrice/text())[1]', 'DECIMAL(18,2)')
        FROM @XmlInput.nodes('/ns0:InvoiceBatch/ns0:Invoice') AS InvoiceNodes(inv)
        INNER JOIN EDIInboundInvoiceHeader h 
            ON h.InvoiceNumber = inv.value('(ns0:InvoiceNumber/text())[1]', 'NVARCHAR(50)')
        CROSS APPLY inv.nodes('ns0:LineItems/ns0:LineItem') AS LineNodes(line);
    END
END

关键注意事项

  • URI完全匹配:必须保证WITH XMLNAMESPACES中的URI与XML文档中xmlns:ns0="..."的内容完全一致,包括大小写、特殊字符和路径,任何偏差都会导致命名空间识别失败。
  • 批量处理而非循环:使用nodes()方法拆分XML节点,配合批量插入,比游标循环效率高得多,避免不必要的性能损耗。
  • 验证XML结构:确保你的XML输入结构与查询中的节点路径匹配,比如示例中的/ns0:InvoiceBatch/ns0:Invoice对应XML的根节点和发票节点层级。

示例XML输入参考

<ns0:InvoiceBatch xmlns:ns0="http://your-actual-namespace-uri">
    <ns0:Invoice>
        <ns0:InvoiceNumber>INV-20240520-001</ns0:InvoiceNumber>
        <ns0:VendorId>1002</ns0:VendorId>
        <ns0:InvoiceDate>2024-05-20</ns0:InvoiceDate>
        <ns0:TotalAmount>1250.00</ns0:TotalAmount>
        <ns0:LineItems>
            <ns0:LineItem>
                <ns0:LineItemNumber>1</ns0:LineItemNumber>
                <ns0:ProductCode>LAP-003</ns0:ProductCode>
                <ns0:Quantity>5</ns0:Quantity>
                <ns0:UnitPrice>250.00</ns0:UnitPrice>
            </ns0:LineItem>
        </ns0:LineItems>
    </ns0:Invoice>
</ns0:InvoiceBatch>

内容的提问来源于stack exchange,提问作者Vipin Jayanarayanan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:34:58