存储过程30个参数,实际使用时传入数量不定,怎么办?


C#,用mysql.data.dll,6.8.3版本(6.7.4也一样)

如果用cmd.Prepare(),直接弹出parameter不够的错误,

不用就等下execute时出错。

才从mssql转过来,不太懂。

ignoreprepare=false;

8 个解决方案

#1


MYSQL 动态SQL + 预处理 语句即可  ,中间的变量可以使用if 判断,如果有值,则使用concat 追加为条件 。

#2


参照存储过程如下 :
CREATE 
PROCEDURE ps_yddl_get_gyjx_jgm_d(IN ps_jgm char(8) CHARACTER SET utf8, IN ps_ywbh varchar(20) CHARACTER SET utf8, IN ps_gybh varchar(350) CHARACTER SET utf8, IN ps_ksrq varchar(10) CHARACTER SET utf8, IN ps_jsrq varchar(10) CHARACTER SET utf8, IN ps_start int(11), IN ps_limit int(11), IN ps_pxfs int(11))
  COMMENT '柜员天绩效情况查询'
BEGIN
  DECLARE ps_sqlwhere VARCHAR(200) default '  ';
  DECLARE ps_order    VARCHAR(50);
  SET ps_sqlwhere = concat(' where   rq between "', ps_ksrq, '"  and  "', ps_jsrq,'"');

  CALL splitString(ps_gybh, "-");
  CASE ps_pxfs
  WHEN '3' THEN
    SET ps_order = ' order by rq ASC ,dgytjid ASC';

  WHEN '2' THEN
    SET ps_order = ' order by ywl DESC ,dgytjid ASC ';
  ELSE
    SET ps_order = ' order by pjfwsj ASC ,dgytjid ASC ';
  END CASE;

  IF (ps_jgm != 'all') THEN
    SET ps_sqlwhere = concat(ps_sqlwhere, '  and jgm = ', ps_jgm);
  END IF;
  IF (ps_ywbh != 'all') THEN
    SET ps_sqlwhere = concat(ps_sqlwhere, '  and  ywbh = ', ps_ywbh);
  END IF;

  IF (ps_gybh != 'all') THEN
    SET ps_sqlwhere = concat(ps_sqlwhere, '  and  gybh in (select * from tmp_split) ');
  END IF;
  SET @ps_sqltotal = concat('select  count(*) into @total  from  jx_dgy_tj ', ps_sqlwhere);
  SET @ps_sqltext = concat('select  dgytjid, jgm, gybh, gyxm, ywbh, ywl, zgpf, zdpf, pjpf, zdfwsj, zcfwsj, pjfwsj, fwsjpm, ywlpm, rq, xq, wdmc,@total as  total from  jx_dgy_tj ', ps_sqlwhere, ps_order, ' limit ', ps_start, ',', ps_limit);
  PREPARE stmt FROM @ps_sqltotal;
     execute stmt;
  PREPARE stmt2 FROM @ps_sqltext;
     execute stmt2;
END

#3


拼不太现实,我要考虑到速度,并发等,而且还有内部逻辑,需要在服务器上完成,即使我在客户端拼好,服务器上执行也会很慢的。

另外问一下,mysql能支持100G的数据库吗?

#4


引用 3 楼 natfit 的回复:
拼不太现实,我要考虑到速度,并发等,而且还有内部逻辑,需要在服务器上完成,即使我在客户端拼好,服务器上执行也会很慢的。

另外问一下,mysql能支持100G的数据库吗?


想说的这样,不在程序中判断就需要在数据库中判断 ,拼接条件是不能避免的!
MYSQL数据库容量理论上没有限制,取决于数据库服务器机器的操作系统对文件大小的限制决定的,与MYSQL本身没有直接关系!

#5


写存储过程的时候,判断各个参数是否存在,前提是给个默认值

#6


在SP中定义30个参数,赋初值,进行判断,字符串累加生成SQL语句,再执行

#7


这个没有办法,在C#程序进行判断吧。然后传入一些空参数。MYSQL端无法实现变参数。

#8


最后我下了mysql的源码,在它添加parameter的地方进行了修改,如果没有 ,直接加了个默认值,顺便把mssql的@也改掉了
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



猜您在找
存储过程接收Array参数传入 存储过程传入可以为空的参数 SQL 存储过程 传入数组参数 SqlServer存储过程传入Table参数 PROCEDURE存储过程传入表参数
智能推荐
 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告