sql server中in超出限制的几种解决方法
sql server 对in 中元素的个数是有限制的,为了跳过这个问题,提供以下几种方法来解决(性能没有做测试):
1.将一个list分裂为多个符合长度的list,然后用 or 拼接sql:( ... where a in (1,2,3) or a in (4,5,7) ... )
2将list转化为字符串 ,然后使用自定义的fn_split 方法将其转化为临时表 进行联表查询(可以使用exist)
fn_split:
CREATE FUNCTION [dbo].[fn_Split] ( @str VARCHAR(MAX), @separator VARCHAR(10) ) RETURNS TABLE AS RETURN ( --Example: SELECT id FROM fn_Split('a,b,d,c',',') SELECT B.id FROM ( SELECT [value] = CONVERT(XML, '<v>' + REPLACE(@str, @separator, '</v><v>') + '</v>') ) A OUTER APPLY( SELECT id = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/v') N(v) ) B ) GO
3.使用sql的 表值参数,将list转化为datatable,然后传递过去进行连表查询(官方推荐):
参考链接:https://medium.com/dapper-net/sql-server-specific-features-2773d894a6ae (需FQ)
sql server:创建表值参数类型
create type dbo.SalesnameTagsType as table ( Salesname NVARCHAR(50) NOT NULL )
c#中dapper 调用:
var dt = new DataTable("SalesmanListType"); dt.Columns.Add("Salesman", typeof(string)); foreach (int i in Enumerable.Range(0, 10)) { dt.Rows.Add(string.Format("{0:0000}", i)); } var sql = "select * from @test"; DynamicParameters temp = new DynamicParameters(); temp.Add("test",dt.AsTableValuedParameter("SalesmanListType")); conn.Query<String>(sql ,temp ).toList();
我这个是测试用的,将list转化为datatable ,自己去查方法,很多。
4.发现忘了一个最基础的最简单的。
如果in后面是表中可读取的数据,使用exist 很不错。