首页 > 数据库 >sqlsever解决传入参数过多的一种思路

sqlsever解决传入参数过多的一种思路

时间:2023-05-04 09:13:30浏览次数:56  
标签:dto 传入 过多 Item str sqlsever mpb mbrn

1.问题

  com.microsoft.sqlserver.jdbc.SQLServerException: 传入的请求具有过多的参数。该服务器支持最多 2100 个参数。请减少参数的数目,然后重新发送该请求。

2.环境

  java + sqlsever 或  sqlsever存储过程

3.java + sqlsever 解决方案

  3.1 将数据处理成XML格式

if (!StringUtil.isEmpty(dto.getFareaID())) {
    String[] split = dto.getFareaID().split(",");
    String str = "<root>";
    for (String areaStr : split) {
        str = str + "<Item>" + areaStr + "</Item>";
    }
    str = str + "</root>";
    dto.setFareaID(str);
} else {
    dto.setFareaID(null);
}

  3.2 查询

SELECT mpb.FBatchNo,mbrn.BatchNumber,mpb.FUnitNames
FROM dbo.MY_PigBatch AS mpb
LEFT JOIN dbo.MY_BatchRecordNo AS mbrn ON mbrn.BatchNO=mpb.FBatchNo AND mbrn.CheckFlag=1
<where>
    AND mpb.FSegmentID=13907
        <if test="dto.fbatchNoSate != null and dto.fbatchNoSate != ''">
            and mpb.FState = #{dto.fbatchNoSate}
        </if>
        <if test="dto.fareaID != null and dto.fareaID != ''">
            and CAST(#{dto.fareaID} as xml).exist('/root/Item[text()=sql:column("mpb.FAreaID")]')=1
        </if>
        <if test="dto.ffieldID != null and dto.ffieldID != ''">
            and CAST(#{dto.ffieldID} as xml).exist('/root/Item[text()=sql:column("mpb.FFieldID")]')=1
        </if>
</where>

4.sqlsever 存储过程解决方案

ALTER PROCEDURE [存储过程名]
    @AreaID XML
AS
BEGIN
    SET NOCOUNT ON;

    select T.c.query('.').value('(Item)[1]','int') as id INTO #tmpArea from @AreaID.nodes('/root/Item') as  T(c)

    select count(1) from table as a
      where @AreaID IS NULL OR  EXISTS(SELECT 1 FROM #tmpArea Area WHERE Area.id=a.FAreaID)
END

5.sql查询例子

select top 100 * from MY_PigBatch mpb
where  CAST('<root><Item>13902</Item><Item>13903</Item></root>' as xml)
            .exist('/root/Item[text()=sql:column("mpb.FAreaID")]')=1

  

标签:dto,传入,过多,Item,str,sqlsever,mpb,mbrn
From: https://www.cnblogs.com/qikai123/p/17370075.html

相关文章

  • mysql连接数过多排查
    五一过节,第二天,一大早被叫起来,现场服务出问题了,问题定位到了,mysql的连接数过多,1040错误,Toomanyconnections,问题是定位到了,要找到导致连接数过多的服务才是重点,执行SHOWPROCESSLIST发现连接数过多  进入服务器命令行,执行以下命令,50078端口是上面截图的host字段对应......
  • sqlsever收缩数据库日志操作
    1、备份事务日志--->备份到其他盘;备份类型->事务日志 2、数据库---->数据库收缩---->文件类型:日志 ......
  • jmeter中get/post请求不同的参数传入
    Content-Type与JMeter接口测试的传参方式有很大关系一、常见Content-Type有三种:1).content-type:application/x-www-form-urlencoded  默认格式,当没有在信息头指定Content-Type的时候,默认使用这种格式传参key1=value1&key2=value2.......2). content-type:application/json......
  • Mybatis Plus传入参数0不起作用
    错误还原:在查询的过程中,传入的workType为0时,该条件不起作用<selectid="xxx">SELECTdi.id,di.name,di.work_type,di.updated...<where><iftest="name!=nullandname!=''">andd......
  • leaflet.openPopup() 方法传入参数是个模板字符串,如何将其改为使用vue的模板实现,可以
    注:这个问题是我使用cursor得到的回答。问:leaflet.openPopup()方法传入参数是个模板字符串,如何将其改为使用vue的模板实现,可以支持数据双向绑定为了将 this.map.openPopup() 方法中的字符串模板替换为支持双向数据绑定的 Vue 模板,您可以使用 Vue.extend() 方法创建一个新......
  • Activity向fragment传入数值
    因项目需要activity向fragment传值,搜索了很久,看了一些书,实现了代码:我传入的是一个int类型值activity(menu)staticintUser_id;//没有static会置0,具体原因不清楚publicintgetUser_id(){returnUser_id;}publicvoidsetUser_id(intuser_id){User_id......
  • C# 根据前台传入实体名称,动态查询数据
    C#根据前台传入实体名称,动态查询数据 前言:项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方式,前端只需传入实体名称即可,例如:SysUser1、获取实体类型varentityType=Assembly.Load("XX......
  • 3500/22M 138607-01 通过多个根联合体的数据传输层
    3500/22M138607-01通过多个根联合体的数据传输层USB4.0结合了PCIe和DP,扩展了市场上的USB应用。这些是USB和Thunderbolt的技术增强,已通过英特尔产品引入市场。USB-IF结合了这些技术,自USB4.0以来,这些技术已成为行业标准。]也参与其中。由于边缘设备和系统具有多个高性能数据处......
  • 【HMS Core】应用内支付FAQ 6-unknownException、订单编号传入
     【关键字】应用内支付、报错 【问题描述1】收到华为的支付回调通知后,通过通知里面的purchaseToken,调用Order服务验证购买Token时报错​【解决方案】1、报错“6-unknownException”有可能是因为请求头里带的认证token有问题,请检查Authorization字段https://developer.hu......
  • JSON.parse意外失败的问题(传入内容在校验网站上检查无误)(传入内容来自CryptoJS.AES.dec
    背景:由CryptoJS.AES.decrypt解码来的数据并进行toString(CryptoJS.enc.Utf8)之后,无法使用JSON.parse转换成json数据,但是使用在线校验工具认为格式正确。可能是由于解码后的字符串包含了一些特殊字符或者不可见字符,导致JSON.parse方法无法正确解析字符串。可以尝试使用console.log......