重置密码执行SQL时出现字符串转uniqueidentifier转换失败报错
报错根因
触发这个转换错误的核心原因是:Password表的userid字段数据类型为uniqueidentifier(SQL Server的全局唯一标识符/GUID类型),你在WHERE条件中传入的筛选值'admin'是普通用户名字符串,不符合GUID的固定格式要求,SQL Server做隐式类型转换时直接失败。uniqueidentifier类型只接受格式合法的36位GUID值(例:'A47239BE-1D5C-4F8A-92C7-3F9D27A1E0B4'),无法把'admin'这类普通字符串解析为对应类型,所以抛出转换错误。
解决方法
- 先确认字段类型,执行以下语句验证表结构:
SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'Password' AND COLUMN_NAME = 'userid'
- 不要直接用
userid = 'admin'做筛选:admin是登录用户名,不是GUID类型的用户ID,你需要关联存储用户基础信息的用户表,通过用户名匹配到对应的GUID用户ID后再执行更新。假设存储用户名的表为dbo.Users,两表通过userid字段关联,用户名字段为username,正确的更新语句如下:
UPDATE p SET p.salt = 'zfkI0NkJiIJR8Rubuuf800cxjp7epM7EjYkQIfzUxI=', p.hash = '96u76IApmLmLzatzGnvFzPq2h4noZZCpc+GATM2VUxk=' FROM [Servicename].[dbo].[Password] p INNER JOIN [Servicename].[dbo].[Users] u ON p.userid = u.userid WHERE u.username = 'admin'
- 如果要直接指定
userid更新,必须先查到admin账号对应的合法GUID值,把WHERE条件替换为WHERE userid = '你查到的实际GUID值'即可。
注意:不要为了跑通语句强行修改
userid字段的数据类型,绝大多数业务系统的账号关联逻辑都依赖GUID类型的用户ID,修改字段类型会导致全平台账号权限、关联数据全部失效。
内容的提问来源于stack exchange,提问作者Jared Ignacio Alonzo
相关产品推荐
相关产品推荐

