variable valor una tabla resultado recuperar obtener mostrar guardar datos consulta c# linq-to-sql

c# - valor - Número máximo de parámetros en la consulta SQL



obtener valor de una consulta sql en c# (1)

Los límites están codificados

  • Parámetros por procedimiento almacenado 2.100
  • Parámetros por función definida por el usuario 2.100

Escribí un código antes de dividir la consulta Contains en lotes y combiné los resultados ... vea aquí para obtener más información .

Experimento con LINQ desde hace algún tiempo. El método típico para enumerar a través de una colección y cambiar algunas de sus propiedades en mi código sería:

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(); }

Alguna vez tengo un consejo para hacer esto por ... parece una manera mucho más inteligente:

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();

Tiene sentido en muchos niveles y me encanta esta solución. Es inteligente y más rápido que el primero.

He utilizado esta solución en un entorno de producción durante algún tiempo.

¿Cuál fue mi sorpresa después de unas pocas semanas al buscar en los archivos de registro de una aplicación y ver esto?

"El flujo del protocolo de llamada a procedimiento remoto (RPC) del flujo de datos tabular (TDS) entrante es incorrecto. Se proporcionaron demasiados parámetros en esta solicitud de RCP. El máximo es 2100".

El LINQ to SQL se convierte where col.Contains(r.ID) a la cláusula IN parece algo así como:
DONDE ID EN (@ p1, @ p1, @ p2…)

La colección col llegó (en mi caso) a más de 2100 elementos y la consulta no se realizó. He investigado el problema y lo que terminé es:

"... El número máximo de parámetros en la consulta de SQL es 2100. Hay más limitaciones, como el hecho de que toda la cadena de consulta no puede tener más de 8044 caracteres".

Me ha encantado tanto la segunda solución. Estoy muy decepcionado con estas limitaciones de SQL Server.

¿Me he perdido algo? ¿Hay algo que pueda hacer para poder usar la versión "where col.Contains (r.ID)"?

Saludos Mariusz

PD. (Yo uso Win XP, C # con LINQ y SQL 2005 Express).