SQL语法错误排查:创建并执行SP_INS_SINHVIEN存储过程报错
排查存储过程
SP_INS_SINHVIEN的语法错误 嘿,咱们来拆解你遇到的Msg 102错误——这是典型的语法/数据类型不匹配问题,只需要对代码做几处调整就能解决。
1. MD5函数使用错误(SQL Server环境)
首先,SQL Server里没有直接的MD5()函数,要生成MD5哈希值得用HASHBYTES('MD5', 输入值)这个函数。而且你的@MATKHAU参数定义成了VARBINARY类型,但HASHBYTES需要的是字符串类型(比如NVARCHAR或VARCHAR),这就造成了类型冲突。
2. 调用时的参数类型不匹配
你把@MATKHAU声明为VARBINARY,但调用存储过程时传入的是明文字符串'123456',这种隐式转换会失败,从而触发你看到的错误。
修正后的存储过程代码
CREATE PROCEDURE SP_INS_SINHVIEN @MASV NVARCHAR(20), @HOTEN NVARCHAR(100), @NGAYSINH DATETIME, @DIACHI NVARCHAR(200), @MALOP VARCHAR(20), @TENDN NVARCHAR(100), @MATKHAU NVARCHAR(100) -- 改为字符串类型,用来接收明文密码 AS BEGIN INSERT INTO SINHVIEN (MASV, HOTEN, NGAYSINH, DIACHI, MALOP, TENDN, MATKHAU) VALUES(@MASV, @HOTEN, @NGAYSINH, @DIACHI, @MALOP, @TENDN, HASHBYTES('MD5', @MATKHAU)) END
修正后的调用语句
EXEC SP_INS_SINHVIEN 'SV01', 'NGUYEN VAN A', '1990-01-01', -- 建议用标准的YYYY-MM-DD日期格式,避免因数据库地区设置导致的解析错误 '280 ANDUONG VUONG', 'CNTT-K35', 'NVA', '123456'
额外提示
- 尽量使用标准日期格式(如
YYYY-MM-DD),防止不同数据库地区设置带来的日期解析问题。 - MD5的安全性已经不足,不推荐用于密码存储,建议改用更安全的算法比如SHA-256(写法是
HASHBYTES('SHA2_256', @MATKHAU))。 - 如果你的
SINHVIEN表中MATKHAU字段是VARBINARY类型,HASHBYTES的返回值刚好匹配;如果是字符串类型,需要用CONVERT(VARCHAR(32), HASHBYTES('MD5', @MATKHAU), 2)转换为十六进制字符串存储。
内容的提问来源于stack exchange,提问作者Phạm Duy Linh
相关产品推荐
相关产品推荐

