修改SQL Server存储过程执行脚本遇两类错误求助
存储过程[Catalogs].[InsAlarmFromXml]修改后两类错误的排查思路
针对"对象引用未设置到对象的实例"错误
- 检查新增SQL语句中的变量/对象引用:确认删除
[Catalogs].[AlarmsSound]、[Catalogs].[AlarmsPopUp]和插入[Catalogs].[AlarmsSound]的语句里,是否用到了存储过程中未定义、未赋值的变量,或是从XML解析的字段未被正确初始化(比如XML节点不存在时返回null,后续直接引用其属性) - 排查XML解析逻辑是否被误改:新增操作可能不小心修改了原有XML节点的读取代码,导致某个必要节点未被获取,后续使用该节点时触发空引用
- 验证新增语句中的对象合法性:虽然已确认表存在,但要检查是否用错了表别名、关联了不存在的视图/函数,或是引用了表中不存在的字段
针对"连接已有打开的DataReader,需先关闭"错误
- 检查嵌套结果集/游标处理:新增操作如果使用了游标,或是调用了其他返回结果集的存储过程,要确认这些结果集或游标是否被正确关闭,避免同一个连接上存在多个未关闭的DataReader
- 确认连接字符串的MARS设置:如果应用程序调用该存储过程的连接字符串未启用
MultipleActiveResultSets=True,当存储过程中同时存在多个未消费的结果集(比如原有逻辑返回结果集,新增操作又产生额外结果集),就会触发该错误 - 排查新增语句是否产生额外结果集:比如删除语句带了
OUTPUT子句返回删除行、插入语句用SELECT SCOPE_IDENTITY()返回自增ID,但原有代码未处理这些结果集,导致连接上残留未关闭的DataReader - 检查事务中的资源释放:新增的删除/插入操作如果加入了事务,要确认异常场景下是否正确回滚并关闭所有打开的DataReader或游标
结合新增操作的额外排查点
- 确认新增删除语句依赖的临时表/表变量是否存在:比如删除操作是否引用了原有存储过程中某个临时表,而该表在执行删除语句时还未创建或已被销毁
- 验证插入
[Catalogs].[AlarmsSound]的字段值合法性:检查插入的字段是否存在不允许null但传入值为null的情况,或是引用了原有逻辑中可能为null的变量,导致插入时触发隐性的空引用错误
内容的提问来源于stack exchange,提问作者Duar Yee
相关产品推荐
相关产品推荐

