¿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
1
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.

2 respuestas más de otros expertos

Respuesta
1
¿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.
Respuesta
Puedes enviarme el mensaje de error,
Saludos,
MRR

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas