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

存储过程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的记录,也会导致查询无结果。

解决方案

  1. 严格对齐存储过程的参数顺序:C#代码中添加SqlParameter的顺序必须和存储过程定义的参数顺序完全一致,先加@storeId,再依次加@lodate、@hidate、@Stationid、@cashierid,最后加@departlist。
  2. 修正参数类型定义:所有参数类型必须和存储过程定义完全匹配:
    • @cashierid、@departlist 指定为SqlDbType.NVarChar,长度设为-1对应MAX类型
    • @lodate、@hidate 指定为SqlDbType.DateTime,直接传DateTime类型值,不要转字符串
    • @Stationid 指定为SqlDbType.VarChar,长度10
  3. 检查参数值传递逻辑:确认@Stationid的传值符合业务需求,测试时如果传空字符串就不要误传01。
  4. 正确的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:00:04