Kotlin Exposed调用SQL Server存储过程返回空结果集问题
问题分析与解决
核心问题
你的代码存在两个关键错误,导致无法正确获取存储过程的返回结果:
- 参数完全不匹配:存储过程需要
@CompOffId和@IsStartFullLeave两个参数,但你调用时传入的是@BranchId,参数名、数量、对应值完全不符。 - 结果集字段读取错误:存储过程返回的列名为
number,但你代码里尝试读取Name和Value这两个不存在的字段,自然读不到数据。
修正后的代码
// 可根据需求定义结果数据类,或直接返回Int data class ValidationResult(val number: Int) val result = withContext(Dispatchers.IO) { transaction { exec( "EXEC HRMS.ValidateCompOff @CompOffId=?, @IsStartFullLeave=?", params = listOf(compOffId, isStartFullLeave), // 替换为你的实际参数值 explicitStatementType = StatementType.SELECT ) { rs -> val resultList = mutableListOf<ValidationResult>() while (rs.next()) { resultList.add(ValidationResult(rs.getInt("number"))) } resultList } } }
简化优化方案
由于存储过程仅返回单个数值,可直接读取结果而非转成列表:
val result = withContext(Dispatchers.IO) { transaction { exec( "EXEC HRMS.ValidateCompOff @CompOffId=?, @IsStartFullLeave=?", params = listOf(compOffId, isStartFullLeave), explicitStatementType = StatementType.SELECT ) { rs -> if (rs.next()) { rs.getInt("number") } else { // 处理异常情况,比如抛出提示 throw IllegalStateException("存储过程未返回预期结果") } } } }
验证注意事项
- 替换代码中的
compOffId和isStartFullLeave为你实际要传入的参数值,确保和SQL Server测试时的参数一致。 - 确认存储过程调用名称正确,你原代码里的
[Stored Procedure Name]要替换为实际的HRMS.ValidateCompOff。
内容的提问来源于stack exchange,提问作者jaymin patel
相关产品推荐
相关产品推荐

