Insert Into关联调用存储过程失效问题技术求助
问题分析与解决方案
首先,我一眼就发现了核心问题——你在带INSERT INTO ... EXEC的调用里参数名传错了!
看你的第三个存储过程USP_Temp的定义,它接收的必填参数是@UserCompanyId int,但在带Insert的调用代码里,你写成了:
Exec dbo.USP_Temp @IsReco = 1, @ReconcileBy = 'system', @CompanyId = @CompanyId, @UserId = @UserId, @finalCollection = @RecoString, @isAutoReconcile = 0
这里的@CompanyId = @CompanyId是错误的,应该和你单独调用时的参数名保持一致:@UserCompanyId = @CompanyId(你的变量是@CompanyId,对应存储过程的@UserCompanyId参数)。
那为什么你会觉得“存储过程未被触发”?大概率是这两个原因:
- 因为参数不匹配,存储过程直接进入了
Catch块,它会往TempReco表插入Reached to USP_Temp - Error Block,但你可能没检查这条错误日志; - 错误触发后,存储过程返回的是
TransferDetailId=0的结果集,这条数据会被插入到ReconcileInsertUpdateLog,但你可能没注意到这些错误行,误以为没执行。
修复步骤
- 修正参数名:把带Insert的调用代码改成下面这样,和单独调用时的参数匹配:
Insert Into dbo.ReconcileInsertUpdateLog(TransferDetailId,Msg,ReconcilationId,IsFutureTransferReconciled) Exec dbo.USP_Temp @IsReco = 1, @ReconcileBy = 'system', @UserCompanyId = @CompanyId, @UserId = @UserId, @finalCollection = @RecoString, @isAutoReconcile = 0
验证执行状态:检查
TempReco表,如果出现Reached to USP_Temp 1 step ahead of Return final Result,说明存储过程正常执行;如果是错误日志,就再排查参数值是否有效。确认表结构匹配:确保
ReconcileInsertUpdateLog的列顺序、数据类型和USP_Temp返回的结果集完全一致(TransferDetailIdint、Msgnvarchar(max)、ReconcilationIdint、IsFutureTransferReconciledint),结构不匹配也会导致插入失败。
额外排查点
- 检查
#RecoData临时表中的CompanyId值是否合法,避免传递无效值导致存储过程内部出错; - 确认
ReconcileInsertUpdateLog表有没有主键、外键等约束,约束冲突也会让你误以为存储过程没被调用。
内容的提问来源于stack exchange,提问作者Mihir Shah
相关产品推荐
相关产品推荐

