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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM