簡體   English   中英

sql查詢中的最大參數數

[英]maximum number of parameters in sql query

有一段時間我會嘗試使用LINQ。 枚舉集合並在我的代碼中更改其某些屬性的典型方法如下所示:

ATDataContext dc = new ATDataContext(Settings.connection_string);

int[] col = ListViewClass.getListViewSelectedPositionTags(listView);

try
{
    foreach (var item in col)
    {
        var ctx = (from r in dc.MailingLists
                   where r.ID == item
                   select r).Single();

        ctx.Excluded = 'Y';
        ctx.ExcludedComments = reason;
    }

    dc.SubmitChanges();
}

有一段時間有一個建議來做到這一點...似乎更聰明的方式:

var ctx = from r in dc.MailingLists
    where col.Contains(r.ID)
    select r;

foreach (var item in ctx)
{
    item.Excluded = 'Y';
    item.ExcludedComments = reason;
}

dc.SubmitChanges();

Iit在很多層面上都很有意義,我喜歡這個解決方案。 它比第一個更聰明,更快捷。

我已經在生產環境中使用了這個解決方案一段時間了。

幾周后,我在搜索應用程序日志文件時看到了什么,並看到了這一點:

“傳入的表格數據流(TDS)遠程過程調用(RPC)協議流不正確。此RCP請求中提供的參數太多。最大值為2100.”

LINQ to SQL將where col.Contains(r.ID)轉換為IN子句,如下所示:
ID IN(@ p1,@ p1,@ p2 ......)

col集合達到(在我的情況下)超過2100個元素,並且查詢無法執行。 我已經對這個問題做了一些研究,最后我得到了:

“... sql查詢中的最大參數數量是2100.還有更多限制,例如整個查詢字符串不能超過8044個字符。”

我非常喜歡第二種解決方案。 我對SQL Server的這些硬編碼限制感到非常失望。

我錯過了什么? 我能做些什么來使用“where col.Contains(r.ID)”版本?

關心馬里烏斯

PS。 (我使用Win XP,C#with LINQ和SQL 2005 Express)。

限制是硬編碼的

  • 每個存儲過程的參數2,100
  • 每個用戶定義函數的參數2,100

我之前編寫了一些代碼,將Contains查詢拆分為批次並合並結果... 請參閱此處了解更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM