存储过程SSMS运行正常 C#通过sp_executesql调用返回空报错
问题产生原因
- 参数顺序完全错位:存储过程定义的参数顺序为
@storeId、@lodate、@hidate、@Stationid、@cashierid、@departlist,但错误调用语句中,把@departlist放在了@cashierid前面传给存储过程,相当于把@cashierid的参数值1001003塞给了@departlist参数,@departlist的空值塞给了@cashierid参数,直接导致查询条件完全不符合预期,返回空结果。 - sp_executesql语法错误:抓取到的语句里把参数类型定义错误写在了存储过程的入参列表中,正常
sp_executesql的第二个参数才是统一的参数定义字符串,错误的语法导致参数解析完全混乱。 - 参数类型不匹配:存储过程中
@cashierid、@departlist为nvarchar(MAX),@lodate、@hidate为datetime类型,但调用时分别被定义为varchar(100)、nvarchar(6)、char(22),隐式转换可能导致日期匹配、字符串匹配失效。 - 参数值不符合预期:正常测试语句中
@Stationid传的是空字符串,而抓取到的错误语句中@Stationid传的是01,如果业务数据中没有对应station_id为01的记录,也会导致查询无结果。
解决方案
- 严格对齐存储过程的参数顺序:C#代码中添加
SqlParameter的顺序必须和存储过程定义的参数顺序完全一致,先加@storeId,再依次加@lodate、@hidate、@Stationid、@cashierid,最后加@departlist。 - 修正参数类型定义:所有参数类型必须和存储过程定义完全匹配:
@cashierid、@departlist指定为SqlDbType.NVarChar,长度设为-1对应MAX类型@lodate、@hidate指定为SqlDbType.DateTime,直接传DateTime类型值,不要转字符串@Stationid指定为SqlDbType.VarChar,长度10
- 检查参数值传递逻辑:确认
@Stationid的传值符合业务需求,测试时如果传空字符串就不要误传01。 - 正确的SQL调用格式参考:
exec sp_executesql N'exec spGetReportDepartSalesALL @StoreID, @lodate,@hidate,@Stationid,@cashierid,@departlist', N'@StoreID varchar(10),@lodate datetime,@hidate datetime,@Stationid varchar(10),@cashierid nvarchar(MAX),@departlist nvarchar(MAX)', @StoreID='1001', @lodate='2021-07-28 00:00:00', @hidate='2021-07-28 23:59:59', @Stationid='', @cashierid='1001003', @departlist=''
内容的提问来源于stack exchange,提问作者Cool Tech
相关产品推荐
相关产品推荐

