Tengo que implementar un algoritmo en los datos que (por buenas razones) se almacenan dentro del servidor SQL. El algoritmo no se ajusta muy bien a SQL, por lo que me gustaría implementarlo como una función o procedimiento de CLR. Esto es lo que quiero hacer:"cursor like" lectura dentro de un procedimiento/función CLR
ejecutar varias consultas (por lo general 20-50, pero hasta 100-200) todos los cuales tienen la forma
select a,b,... from some_table order by xyz
. Hay un índice que se ajusta a esa consulta, por lo que el resultado debería estar disponible más o menos sin ningún cálculo.Consumir los resultados paso a paso. El paso exacto depende de los resultados, por lo que no es exactamente predecible.
Agregue algunos resultados al repasar los resultados. Solo consumiré las primeras partes de los resultados, pero no puedo predecir cuánto necesitaré. El criterio de detención depende de algún umbral dentro del algoritmo.
Mi idea era abrir varias SqlDataReader, pero tengo dos problemas con esta solución:
Puede tener sólo un SqlDataReader por conexión y dentro de un método CLR sólo tengo una conexión - hasta donde yo entiendo.
No sé cómo decirle a SqlDataReader cómo leer datos en trozos. No pude encontrar documentación sobre cómo debe comportarse SqlDataReader. Por lo que yo entiendo, está preparando todo el conjunto de resultados y cargaría todo el resultado en la memoria. Incluso si consumiera solo una pequeña parte de eso.
¿Alguna pista sobre cómo solucionar eso como método CLR? ¿O hay una interfaz de nivel más bajo para el servidor SQL que es más adecuada para mi problema?
Actualizar: que debería haber hecho dos puntos más explícitos:
Estoy hablando de grandes conjuntos de datos, por lo que una consulta podría resultar en 1 millón de registros, pero mi algoritmo sólo el consumiría primeros 100-200 unos. Pero como dije antes: no sé el número exacto de antemano.
Soy consciente de que SQL puede no ser la mejor opción para ese tipo de algoritmo. Pero debido a otras limitaciones tiene que ser un servidor SQL. Así que estoy buscando la mejor solución posible.
Solo escribo una pequeña aplicación C# si un procedimiento almacenado no funciona. –
Sin saber lo que estás haciendo exactamente, me estremezco cuando hablas de iterar a través de los datos paso a paso. ¿Has intentado encontrar una forma de manejar esto? Los métodos basados en conjuntos pueden ser bastante sofisticados y años luz más rápidos que fila por agonía-fila. Dicho esto, sí, puede haber algunas calcuaciones muy complejas que deben manejarse una fila a la vez, simplemente no me he encontrado con muchas a través de los años. – HLGEM
Lo he implementado usando sets, pero tuve que "usarlos de alguna manera". Probablemente me habría escrito su respuesta, pero el código basado en el conjunto es realmente incómodo y se está convirtiendo en una pesadilla para mantener y depurar. Normalmente no me gustan las operaciones del cursor, pero como sé que voy a recorrer un índice en orden, creo que es la mejor opción. La única alternativa podría ser DSL, que genera código SQL. – Achim