

新闻资讯
技术教程SQL Server中IN参数超2100个时应改用临时表、分批查询或表值参数方案;首选临时表,因其稳定、易用且无需额外建模。
当IN查询参数超过2100个(SQL Server限制),Dapper原生语法 WHERE Id IN @Ids 会直接报错——这不是Dapper的缺陷,而是SQL Server底层协议(TDS)对单条命令参数数量的硬性约束。绕过它需要改变数据传递方式,而非拼接字符串。
这是最稳定、可扩展性最强的方案,尤其适合一次性传入数千甚至上万个ID。
#temp_ids),结构简单,只含一列(如 id INT 或 id UNIQUEIDENTIFIER)connection.Execute() 批量插入ID(支持 IEnumerable 直接传入)JOIN #temp_ids 或 WHERE EXISTS (SELECT 1 FROM #temp_ids t WHERE t.id = main.id)
适用于ID集合可预知、且总数量在数万以内,逻辑简单、改动最小。
Query(sql, new { Ids = batch })
Concat() 或 List.AddRange() ,注意内存累积SQL Server专属高级方案,性能接近原生JOIN,但需提前建模。
CREATE TYPE dbo.IntList AS TABLE (Value INT)
DataTable,添加
列并填充ID数据new SqlServerTypes.StructuredUserDefinedTypeParameter(...) 或 Dapper+SqlMapperExtensions 封装为参数WHERE EXISTS (SELECT 1 FROM @IdsTable t WHERE t.Value = main.Id)
这些看似“快捷”的方式实际隐患明显:
基本上就这些。核心思路很明确:把“参数太多”这个问题,从“传参”转移到“数据落地”,让数据库自己做匹配。临时表方案上线快、兼容好,大多数业务场景首选它。