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