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

将完整XML存入SQL Server列时遇解析错误,求解决方案

问题描述

尝试将完整XML存入SQL Server表的XML类型列时,持续报错:

[SQL Server]XML parsing: line 0, character 0, unrecognized input signature

已将目标列设置为XML数据类型,存储过程代码如下:

ALTER Procedure [dbo].[PopulateGECH_ICU_DataTable]
  @HospitalNumber VARCHAR(20),
  @CaseID VARCHAR(20),
  @SpellID VARCHAR(20),
  @XML XML,
  @ProcessFlag VARCHAR(5),
  
  @LogComment VARCHAR (100) OUTPUT,
  @Alert INT OUTPUT

AS
BEGIN

    SET NOCOUNT ON;
    BEGIN TRAN  

        SET @LogComment = 'No Log Comment'
        SET @Alert = 0 
        
        
        BEGIN
        INSERT INTO test.GE_Table(HospitalNumber,CaseNumber,SpellId,XML,UserCreate,CreateDateTime,UserModifed,ModifiedDateTime,Processed)
        VALUES (@HospitalNumber,@CaseID, @SpellID, @XML, 'Service' , GETDATE(), 'Service' , GETDATE(), @ProcessFlag)
        
        SET @LogComment = 'Process Flag Updated'
        
        END
    
    IF @@ERROR <> 0
    BEGIN
        ROLLBACK TRAN
        RETURN 99
    END 
        
    COMMIT TRAN
END

尝试插入的XML参数内容:

<TEST xmlns='http://tempuri.org/ICMPDSv3_1.xsd'><ADMISSION><identifier>ZX000</identifier><ACON>U</ACON><ACSD>0</ACSD><WKG>80</WKG><WKGEST>1</WKGEST></ADMISSION></TEST>
错误原因分析

这个错误说明SQL Server无法识别接收到的XML数据为有效格式,常见触发原因:

  • XML数据包含UTF-8 BOM头(字节顺序标记),SQL Server解析带BOM的XML会失败
  • 调用存储过程时未正确传递XML类型参数,而是传入了带不可见控制字符的字符串
  • XML参数为空或未初始化,导致SQL Server尝试解析空内容
解决方法

1. 移除XML的BOM头

用十六进制编辑器打开XML数据,检查开头是否存在EF BB BF(UTF-8 BOM标记),若存在则删除该标记后再尝试插入。

2. 验证XML格式有效性

将XML内容复制到本地XML验证工具(如Visual Studio的XML编辑器),确认标签闭合、结构完整、命名空间格式正确。你的示例XML格式是有效的,这一步主要排查隐藏的格式问题。

3. 优化存储过程的参数处理

将XML参数改为NVARCHAR(MAX)类型,显式转换并捕获解析错误,方便定位问题:

ALTER Procedure [dbo].[PopulateGECH_ICU_DataTable]
  @HospitalNumber VARCHAR(20),
  @CaseID VARCHAR(20),
  @SpellID VARCHAR(20),
  @XMLStr NVARCHAR(MAX), -- 改为字符串参数
  @ProcessFlag VARCHAR(5),
  
  @LogComment VARCHAR (100) OUTPUT,
  @Alert INT OUTPUT

AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRAN  

    SET @LogComment = 'No Log Comment'
    SET @Alert = 0 

    DECLARE @XML XML
    BEGIN TRY
        -- 显式转换XML并捕获错误
        SET @XML = CAST(@XMLStr AS XML)
    END TRY
    BEGIN CATCH
        SET @LogComment = 'XML解析失败: ' + ERROR_MESSAGE()
        SET @Alert = 1
        ROLLBACK TRAN
        RETURN 101
    END CATCH
        
    INSERT INTO test.GE_Table(HospitalNumber,CaseNumber,SpellId,XML,UserCreate,CreateDateTime,UserModifed,ModifiedDateTime,Processed)
    VALUES (@HospitalNumber,@CaseID, @SpellID, @XML, 'Service' , GETDATE(), 'Service' , GETDATE(), @ProcessFlag)
    
    SET @LogComment = 'Process Flag Updated'
    
    IF @@ERROR <> 0
    BEGIN
        ROLLBACK TRAN
        RETURN 99
    END 
        
    COMMIT TRAN
END

4. 规范调用端的参数传递

如果是应用程序调用存储过程(如C#),优先传递强类型XML对象(如XElement或XmlDocument),避免直接传递字符串导致编码丢失。若必须传递字符串,确保使用对应SQL ServerNVARCHAR(MAX)的类型传递,避免字符格式错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:54:19