You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:27:37