将完整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
相关产品推荐
相关产品推荐

