MS SQL Server存储过程执行成功但未更新表问题排查
问题分析与解决方案
嘿,我一眼就揪出问题的核心啦!
根本原因
你的PostMedias表中,PostMediaID是NOT NULL PRIMARY KEY,但完全没设置成自增标识列(IDENTITY)。而你的存储过程执行INSERT时,既没手动给这个必填主键赋值,数据库也没有自动生成它的规则——这就导致插入操作直接失败,自然没有数据写入表中,SCOPE_IDENTITY()返回NULL也就在情理之中了。
另外,你得到的返回值-6是SQL Server的错误代码ERROR_PROCEDURE_CALL_FAILED,这也进一步证实了存储过程里的INSERT语句执行失败了。
修复步骤
给主键添加自增标识属性
你需要让数据库自动为PostMediaID生成唯一值,所以要把它设为自增列。如果是新表,可以直接重新创建:CREATE TABLE PostMedias( PostMediaID int NOT NULL PRIMARY KEY IDENTITY(1,1), PostID int NOT NULL FOREIGN KEY REFERENCES Posts(PostID), ImageName varchar(64), VideoName varchar(64), CreatedDateTime datetime NOT NULL )如果表已经存在(且现有数据的主键没有冲突),可以用
ALTER TABLE修改:ALTER TABLE PostMedias ALTER COLUMN PostMediaID int NOT NULL IDENTITY(1,1)修正
@VideoName的参数值
你当前传入的@VideoName = 'NULL'是一个字符串,而不是SQL里的空值NULL。如果业务上这个字段允许为空,应该改成:DECLARE @return_value int EXEC @return_value = dbo.spPostMedia_Create @PostID = 6, @ImageName = 'CDD4A0CB9DEA4F739E76239F0143EA85.jpg', @VideoName = NULL SELECT 'Return Value' = @return_value
验证
完成上述修改后,重新执行存储过程,就能成功插入数据了。此时SCOPE_IDENTITY()会返回新生成的PostMediaID,返回值也会变为0(代表存储过程执行成功)。
内容的提问来源于stack exchange,提问作者Sam Javed
相关产品推荐
相关产品推荐

