¿Es superable la restricción de 16 tablas que me aparece en el SQL Server?
Tengo un consulta bastante grande y cuando la ejecuto me sale un error que las query o las vistas han superado las 16 tablas. Ahora mi pregunta, ¿esta restricción de 16 tablas se puede modificar? ¿Y si se puede desde donde? Tengo el SQL Server 6.5.
Respuesta de mrivasr
0
0
mrivasr, Java J2ee Jee Oracle BEA JBoss SQL Server
Esta restricci{on no se puede modificar, es una restricción de SQL SERVER. En versiones superiores de SQL esta limitaci{on se extiende hasta 256 tablas. ¿Qué puedes hacer?, simplifica la consulta haciendo algunas vistas entre 2 o más tablas. Por ejemplo, supongamos que las tablas se llaman: a, b, c ... p, q. Diseña una vista con las tablas a, b y c. O las que haga falta hasta que tengas menos de 16 tablas eo vista en cada Consulta
Hola, probé lo que me comentas de las vista, pero no funciono, osea, en la consulta aparentemente tiene en cuenta las tablas que forma parte de la vista, porque sacado algunas tablas de la vista la consulta anda, Desde ya muchas gracias.
¿Comentame un poco... cual es el ultimo service pack que tienes instalado?... como es el mensaje de error exacto.?
Hola. El mensaje que me sale es el siguiente: Msg 4408, Level 19, State 1 The query and the views in it exceed the limit of 16 tables. Me fije cual es el service pack que tiene instalado es el 6 para el Servidor NT, ¿a ese service pack te referís? ¿O a alguno del SQL Server? Tengo la consulta que quiero hacer, ¿pero es muy grande si quieres te la paso? Desde ya muchas gracias por tu tiempo. Saludos, Javier
Esta es una restricción del SQL 6 que fue ampliada con el SQL 7 a 256 tables. De todas maneras, Pasame le service pack que tiene el sql select @@version...y Pasame la consulta para evr si la podemos simplificar
No tengo ningún service pack para SQL server Instalado. Te explico como viene la mano: La mayor parte de los datos la saco de la vista Seguimiento que acá están los datos de los clientes. Después esta la tabla Cuotas_vencimiento que son todas la cuotas que tiene el plan y su fecha de vencimiento y la otra tabla Cuotas_cobradas que tiene los pagos que efectúo el cliente. Ahora lo que yo quiero hacer es lo siguiente: sumar los importe que pago el cliente para cada cuota y compararla con el importe de la cuota que es guarda en cuota_venciminiento y si son iguales es que el cliente pago la cuota en su totalidad, sino la pago parcialmente. Espero que hayas entendido algo. SELECT SE.Capital AS Monto, SE.Id_Zona, ZO.Descripcion AS Zona, SE.Id_Individuo, SE.Id_Grupo, SE.Id_Operacion, PR. Nombre AS Promotor, LC. Descripcion AS Linea_Credito, SE.Nombre_Titular, SE.Domicilio_Particular, SE.Domicilio_Comercial, SE.Telefono_particular, (Select count(*) From Cuotas_vencimientos CV1, (SELECT CV.id_operacion, CC.Cuota, Sum(CC.Importe) AS Total FROM Cuotas_vencimientos CV, cuotas_cobradas CC WHERE (CV.Cuota=CC.Cuota) And (CV.id_operacion=CC.ID_Operacion) And not cc.estado in (2,3) GROUP BY CV.id_operacion, CC.Cuota) aux Where CV1.Importe = Aux.Total and Cv1.Id_Operacion = 1393 and Cv1.Id_Operacion = Aux.Id_operacion And Cv1.Cuota = Aux.Cuota) as Cuotas_pagadas_totalmente, (SELECT COUNT(Cuota) FROM cuotas_vencimientos CV1 Where CV1.ID_Operacion = SE.ID_Operacion AND (SELECT COUNT(Cuota) FROM Cuotas_Cobradas CC1 WHERE CC1.ID_Operacion = CV1.ID_Operacion AND NOT CC1.Estado IN (2,3) AND CC1.Fecha_Pago <= '05/19/2003' AND CC1.Cuota = CV1.Cuota ) <> 0 ) AS Cuotas_Pagadas, COUNT(CV.Cuota) - COUNT(CC.Cuota) AS Cuota_Atrasadas, ISNULL((SELECT ISNULL(COUNT(*),0) FROM Cuotas_Vencimientos CV1 WHERE CV1.id_Operacion = SE.Id_Operacion) , 0) Total_Cuotas, ISNULL((SELECT MAX(Fecha_pago) From Cuotas_Cobradas Where ID_Operacion = SE.ID_Operacion AND fecha_pago <= '05/19/2003') , '01/01/1900') AS FechaUltimoPago, ((select Sum(CV2.Importe) From Cuotas_Vencimientos CV2 Where CV2.Id_Operacion = Se.Id_Operacion And CV2.Fecha_VEncimiento < '05/20/2003') -(Sum(CC.Importe))) as mora_pesos FROM Seguimiento SE INNER JOIN Zonas ZO (NOLOCK) ON ZO.id_Zona = SE.id_Zona INNER JOIN cuotas_vencimientos CV (NOLOCK) ON CV.id_Operacion = SE.id_Operacion AND NOT CV.estado IN(2,3) LEFT OUTER JOIN cuotas_cobradas CC (NOLOCK) ON CC.id_Operacion = CV.id_Operacion AND CC.Cuota = CV.cuota AND NOT CC.estado IN(2,3) AND CC.fecha_pago <= '05/19/2003' LEFT JOIN Promotores PR ON (PR.Id_Promotor = SE.Id_Promotor) LEFT JOIN lineas_credito LC ON (LC.Id_Linea = SE.Id_Linea) WHERE CV.fecha_vencimiento <= '05/19/2003' and SE.Id_Operacion = 1393 and CC.Cuota is not null GROUP BY SE.id_individuo, SE.id_grupo, SE.id_Operacion, SE.id_zona, ZO.Descripcion, SE.Capital, PR.Nombre, LC.Descripcion, SE.Nombre_Titular, SE.Domicilio_Particular, SE.Domicilio_Comercial, SE.Telefono_particular Order By SE.id_grupo, SE.id_individuo, SE.ID_Operacion
Primero te aconsejo instalar el ultimo service pack el 5a. http://www.microsoft.com/spain/partner/soporte/servicepacks/servidores/sql.asp Luego en lo que puedas crea vistas para traer los datos, de manera que achiques el numero de table o views que accedes en la consulta. Si esto no funciona avisame. Estoy a la espera de tu respuesta...(o te mando el script como tendría que ser)
¿Cuándo ejecutas una consulta que tiene vistas, las tablas que están incluidas en la vista las tiene en cuanta la consulta? Osea, si yo tengo una vista 1 que obtiene datos de 4 tablas. Y en la consulta hago referencia a esta vista y ademas a otras 3 tablas, como es la cosa. Esta contándome que tengo 4 tablas en uso en la consulta, las 3 tablas más la vista o 7 la suma de las 4 tablas de la vista y la 3 tablas de la consulta. Gracias por todo.
No, lo que esta contando es las tablas en el join, en la consulta. Esta te llega a más 16. Por ejemplo si simpleficas la consulta y la dividís en 4 views (las cuales traen datos de 4 tablas cada una) no tendrías problemas, y ejecuta más rapido. (Siempre un cuando los datos sean para lectura) * Otra forma es crear uns tabla (puede ser temporal) con los datos que vayas necesitando (podes poner los datos calculados) para despues acceder a esta tabla en la consulta principal usando menos join. (Usa create #table para crear una tabla temporal)
¿Vos decís de hacer un tabla temporal que tenga los datos de cliente y después tendría que recorrer la tabla temporal y por cada registro de esa tabla hacer la consulta para los datos calculados? ¿Si tienes un ejemplo de este tipo me lo pasarías?
CREATE TABLE #TmpCuotas (Idcliente as integer, cuotaspagas as integer, cuotasvencidas as integer, ) Declare @idcleinte integer DECLARE Curcliente CURSOR FOR SELECT clienteid FROM Clientes OPEN Curcliente FETCH NEXT FROM Curcliente INTO @idcleinte WHILE @@FETCH_STATUS=0 BEGIN insert into #tmpcuotas (idcleinte,cuotaspagas,cuotasvencidas) values(@idcleinte, (Select.....),(Select....)) end CLOSE Curcliente DEALLOCATE Curcliente Después en tu consulta principal... haces un select de los campos de la tabla #TmpCuotas. Así vas a disminuir los joins.