valores valor tabla stored retornar procedimientos procedimiento parametros funciones entrada ejecutar devolver datos con almacenados almacenado sql-server database sql-server-2005 sql-server-2000

sql-server - valor - procedimientos almacenados sql



¿Alguna vez encontró una consulta que SQL Server no pudo ejecutar porque hacía referencia a demasiadas tablas? (8)

Me gustaría ver esa consulta, pero me imagino que es un problema con algún tipo de iterador, y aunque no puedo pensar en ninguna situación donde sea posible, apuesto a que es de un mal momento / caso / cursor o una tonelada de vistas mal implementadas.

¿Alguna vez has visto alguno de sus mensajes de error?

- SQL Server 2000

No se pudo asignar una tabla auxiliar para la resolución de vista o función.
Se superó el número máximo de tablas en una consulta (256).

- SQL Server 2005

Demasiados nombres de tabla en la consulta. El máximo permitido es 256.

Si es así, ¿qué has hecho?

¿Abandonado? ¿Convenció al cliente de simplificar sus demandas? Denormalized la base de datos?

@ (todos quieren que publique la consulta):

  1. No estoy seguro de si puedo pegar 70 kilobytes de código en la ventana de edición de respuestas.
  2. Incluso si puedo esto, esto no ayudará, ya que estos 70 kilobytes de código harán referencia a 20 o 30 vistas que yo también tendría que publicar, ya que de lo contrario el código no tendrá sentido.

No quiero sonar como si estuviera alardeando aquí, pero el problema no está en las consultas. Las consultas son óptimas (o al menos casi óptimas). He pasado incontables horas optimizándolos, buscando cada columna y cada tabla que se puede eliminar. Imagínese un informe que tiene 200 o 300 columnas que deben rellenarse con una sola instrucción SELECT (porque así fue como se diseñó hace unos años cuando todavía era un informe pequeño).


Nunca me he encontrado con este tipo de situación, y para ser honesto, la idea de hacer referencia a> 256 tablas en una consulta me llena de temor mortal.

Su primera pregunta probablemente debería ser "¿Por qué tantos?", Seguido de cerca por "¿Qué información NO necesito?" Me preocuparía que la cantidad de datos que se devuelven de dicha consulta también empezara a afectar el rendimiento de la aplicación de forma bastante severa.


Para SQL Server 2005, recomendaría usar variables de tabla y construir parcialmente los datos sobre la marcha.

Para hacer esto, crea una variable de tabla que represente el conjunto de resultados final que deseas enviar al usuario.

Luego encuentre su tabla principal (digamos la tabla de órdenes en su ejemplo anterior) y extraiga esos datos, más un poco de datos suplementarios que son solo decir uno que se une (nombre del cliente, nombre del producto). Puede hacer un SELECT INTO para poner esto directamente en su variable de tabla.

A partir de ahí, repita en la tabla y para cada fila, haga un montón de pequeñas consultas SELECT que recuperen todos los datos suplementarios que necesita para su conjunto de resultados. Inserta estos en cada columna sobre la marcha.

Una vez completado, puede hacer un simple SELECCIONAR * de su variable de tabla y devolver este conjunto de resultados al usuario.

No tengo ningún número difícil para esto, pero ha habido tres instancias distintas en las que he trabajado hasta ahora, donde hacer estas consultas más pequeñas realmente ha funcionado más rápido que hacer una consulta de selección masiva con un montón de combinaciones.


Publique la consulta: D

También siento que uno de los posibles problemas podría ser tener toneladas (leer más de 200) de tablas de nombre / valor que podrían condensarse en una única tabla de búsqueda.


@chopeen Puede cambiar la forma en que calcula estas estadísticas y, en su lugar, mantener una tabla separada de todas las estadísticas por producto. Cuando se realiza un pedido, recorra los productos y actualice los registros apropiados en la tabla de estadísticas. Esto desplazaría una gran parte de la carga de cálculo a la página de pago en lugar de ejecutar todo en una gran consulta al ejecutar un informe. Por supuesto, hay algunas estadísticas que no van a funcionar tan bien de esta manera, por ejemplo, haciendo un seguimiento de las próximas compras de los clientes después de comprar un producto en particular.


Esto ocurriría todo el tiempo al escribir Informes de Reporting Services para las instalaciones de Dynamics CRM que se ejecutan en SQL Server 2000. CRM tiene un esquema de datos muy normalizado que da como resultado muchas combinaciones. En realidad, hay una revisión que aumentará el límite de 256 a 260: http://support.microsoft.com/kb/818406 (siempre pensamos que era una gran broma por parte del equipo de SQL Server).

La solución, como lo alude a Dillie-O, es identificar "subunidades" apropiadas (preferiblemente aquellas que se usan varias veces) y factorizarlas en variables temp-table que luego usa en sus uniones principales. Es un PIA importante y a menudo mata el rendimiento. Lo siento por ti.

@ Kevin, me encanta esa camiseta, lo dice todo :-).


Tuve el mismo problema ... mi caja de desarrollo ejecuta SQL Server 2008 (la vista funcionó bien) pero en producción (con SQL Server 2005) la vista no. Terminé creando vistas para evitar esta limitación, usando las nuevas vistas como parte de la consulta en la vista que arrojó el error.

Un poco tonto teniendo en cuenta que la ejecución lógica es la misma ...


Tuve el mismo problema en SQL Server 2005 (funcionó en 2008) cuando quería crear una vista. Resolví el problema creando un procedimiento almacenado en lugar de una vista.