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 很不错。

posted @ 2020-05-20 15:13  翱翔的小鱼  阅读(5016)  评论(0编辑  收藏  举报