SQL Server主键为uniqueidentifier的更新存储过程无法更新问题
SQL Server uniqueidentifier类型主键更新存储过程不生效排查方案
常见原因及修复方法
参数传值异常
占比最高的故障原因:- 传入的
@Category_Id参数值不是合法的GUID格式,隐式转换为uniqueidentifier类型后生成的值与表中记录不匹配,或是参数直接被传入了NULL - 传入的
@Category_Id在Category表中无对应记录,WHERE条件无匹配行自然无更新
排查方法:在UPDATE语句前添加SELECT @Category_Id AS Input_CategoryId,执行存储过程后将返回值和Category表的Category_Id字段比对,确认存在对应记录。
- 传入的
存储过程命名冲突
当前存储过程名为Update,属于SQL Server的DML关键字,调用时如果未加方括号和schema前缀,会被SQL解析器识别为UPDATE命令而非存储过程,导致执行异常。
修复方案:将存储过程重命名为非关键字名称,示例:ALTER PROCEDURE [dbo].[UpdateCategory] @Category_Code nvarchar(20), @Category_Name nvarchar(167), @About_Category nvarchar(max), @Parent_Category_Id uniqueidentifier, @Is_Enable bit, @Is_Active bit, @Is_Block bit, @Category_Id uniqueidentifier AS BEGIN SET NOCOUNT ON; UPDATE Category SET Category_Code = @Category_Code, Category_Name = @Category_Name, About_Category = @About_Category, Parent_Category_Id = @Parent_Category_Id, Is_Enable = @Is_Enable, Is_Active = @Is_Active, Is_Block = @Is_Block WHERE Category_Id = @Category_Id END调用时显式指定完整名称和参数名:
EXEC [dbo].[UpdateCategory] @Category_Code = 'C001', @Category_Name = '示例分类', @About_Category = '分类描述', @Parent_Category_Id = 'xxxx-xxxx-xxxx-xxxx', @Is_Enable = 1, @Is_Active = 1, @Is_Block = 0, @Category_Id = 'yyyy-yyyy-yyyy-yyyy'参数传递顺序错误
如果调用存储过程时未显式指定参数名,仅按位置传参,很容易出现参数错位,导致@Category_Id拿到其他参数的值,无匹配行可更新。始终显式指定参数名即可避免该问题。事务与锁问题
若调用存储过程的上层逻辑开启了事务但未执行COMMIT,或是更新的行被其他事务锁定,会导致更新结果不可见、或是执行超时后被回滚。可以通过SQL Server活动监视器查看当前锁等待情况排查。约束与触发器拦截
如果Category表存在UPDATE触发器、或是字段有检查约束、外键约束,不符合规则的更新会被数据库拦截,可检查执行存储过程时抛出的错误提示,核对约束规则。
内容的提问来源于stack exchange,提问作者Cse Engineer
相关产品推荐
相关产品推荐

