拼接sql 参数化 where userId in(@userIds)的问题
这里@userIds 如果 写成101,202,301翻译后的sql的where部分会是:
where userId in('101,202,301');
而不是期待的:
where userId in(101,202,301);前者前后多了引号。
在我使用ef.core连接mysql查询时,我这样写,就出现查出来的数据比sql脚本查出来的数据要少几条的情况。
所以这样写,可能可以查出来数据,但数据可能不会完整,而且还会是错误的数据。所以以后不要这样写了。
我想起,我们在拼接参数化时,可以这样写,比如 userCode=@search,而不是这样写:
userCode='@search';这种在参数化上加了引号的反而还要出错。
在前面最开始,即使我们以为他是数字, 但101,202...这样拼接就是字符串了,
指定的paramter或者默认就是为varchar等字符类型就会在参数前后自动加引号的。根据数据值值推断的默认sqlType类型。
省事的解决办法是,直接不在in后面使用用参数化,直接把值拼接到sql中去,比如 where userId in ({userIds});userids就等于“101,202,303”
非要使用参数化,就一个值一个参数的拼接。
@userId1 101 int类型
@userId2 202 int类型
@userId3 303 int类型
sql写法就是:where userId in(@userId1,@userId2,@userId3);
参数化的值多了,网上说超过2000个,就不得行了。
也没试过。但如果值很多,就不用in好点吧。