Error interno de SQL

20/05/2008 - 19:50 por Francisco | Informe spam
Que tal señores. El siguietne T-SQL me genera un mensaje de "Error interno
de SQL" Error 8624. Analizando es por la expresion
"SubString(d1.codscc,3,2)" que esta en la subconsulta interna. La pregunta
es porque el error si es una comparacion simple de cadena y la consulta es
simple.
Tengo SQL 2000 STANDAR EDITION SERVICE PACK 2. SERVER WK2000.

/*Obtener los saldos a un mes antes y del mes*/
SELECT SubString(codscc,3,2) As codtie,
saldoant = (SELECT SUM(debe-haber) FROM tbldiario d2 WHERE
SubString(d2.codscc,3,2)=SubString(d1.codscc,3,2) And mes_as<4),
SUM(debe) As debe,SUM(haber) As haber,SUM(debe-haber) As saldo
FROM tbldiario d1 WHERE mes_as=4 GROUP BY SubString(codscc,3,2)

Saludos...

Preguntas similare

Leer las respuestas

#1 Gux (MVP)
20/05/2008 - 22:52 | Informe spam
Voy a formatear un poco la consulta para que se lea con más facilidad:

SELECT
SubString(codscc,3,2) As codtie,
saldoant = (
SELECT SUM(debe-haber)
FROM tbldiario d2
WHERE SubString(d2.codscc,3,2)=SubString(d1.codscc,3,2) And mes_as<4
),
SUM(debe) As debe,
SUM(haber) As haber,
SUM(debe-haber) As saldo
FROM
tbldiario d1
WHERE
mes_as=4 GROUP BY SubString(codscc,3,2)


Me temo que el problema es que SubString(d1.codscc,3,2) está referenciando a
d1.codscc, un objeto sobre el cual no tiene visibilidad la subconsulta,
debido a que el alias d1 está definido en la consulta contenedora de la
subconsulta.

Observo que está intentando hacer un auto-join de TblDiario consigo misma.P
uede usted explicar qué es lo que necesita hacer?

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Francisco" wrote:

Mostrar la cita
#2 Francisco
20/05/2008 - 23:26 | Informe spam
Hola que tal. Bien lo que deseo es obtener en una columna los saldos de unos
movimientos a un mes antes a la que referencia el WHERE contenedora. Ahora
segun tu respuesta me indicas que el alias "d1" no es visible dentro de la
subconsulta interna. Pero yo creo que si puesto que si cambio el where de la
subconsulta asi: "WHERE SubString(d2.codscc,3,2)Ñ.codscc And mes_as<4 " si
se ejecuta la subconsulta claro que con los valores que no espero. En muchas
oportunidades he diseñado SELECT'S contenedoras y subconsultas internas
similar a la estructura del caso y nunca he tenido problemas hasta hoy. Lo
que he notado es que si utilizo un funcion de cadena(LEFT, RIGHT, SUBSTRING,
etc) tanto en el GROUP BY contenedora como en el WHERE de la subconsulta me
produce ese error. Si en el GROUP BY contenedora pongo el campo solo sin la
funcion de cadena y en el WHERE de la subconsulta cualquier expresion,
entonces no se produce ese error. Bueno de todas formas ya le he encontre la
solucion claro que tuve que hacer 2 SELECT en vez de una que esperaba.

Caso 1
/*Where subconsulta
WHERE Right(d2.codscc,2)=Right(d1.codscc,2)
y
/*Group by del SQL contenedora
GROUP BY Right(d1.codscc,2) --Produce ERROR

Caso 2. OK
/*Where subconsulta
WHERE Right(d2.codscc,2)=Right(d1.codscc,2)
y
/*Group by del SQL contenedora
GROUP BY codscc --OK, no hay error.



"Gux (MVP)" escribió en el mensaje
news:
Mostrar la cita
a
Mostrar la cita
misma.P
Mostrar la cita
interno
Mostrar la cita
pregunta
Mostrar la cita
es
Mostrar la cita
#3 Carlos M. Calvelo
21/05/2008 - 08:19 | Informe spam
Hola Francisco,

On 20 mei, 23:26, "Francisco" wrote:
Mostrar la cita
No tienen por qué ser dos consultas separadas, si es eso lo que
quieres decir.

Puedes probar así:

SELECT
codtie,
(SELECT SUM(debe-haber)
FROM tbldiario
WHERE SubString(codscc,3,2)Ñ.codtie And mes_as<4
) as saldoant,
debe, haber, saldo
FROM
(SELECT
SubString(codscc,3,2) As codtie,
SUM(debe) As debe,
SUM(haber) As haber,
SUM(debe-haber) As saldo
FROM tbldiario
WHERE mes_as=4
GROUP BY SubString(codscc,3,2)
) d1

Ten cuidado además con los SUM(debe-haber). Si para un registro
uno de los dos es null, debe-haber será null. Y si no hay registros
que sumar también te dará null.

Yo los cambiaría por esto:
ISNULL(SUM(debe)-SUM(haber),0)

y las otras dos sumas también:
ISNULL(SUM(debe),0)
ISNULL(SUM(haber),0)

Saludos,
Carlos
#4 Carlos M. Calvelo
21/05/2008 - 09:01 | Informe spam
Hola,

Mostrar la cita
Corrección:
Debería ser ISNULL(SUM(debe),0) - ISNULL(SUM(haber),0)
para cubrir todos los casos de los que hablaba.

Saludos,
Carlos
#5 Rafael Cano
21/05/2008 - 09:08 | Informe spam
No deberia ser:
SUM(ISNULL(Debe, 0)) - SUM(ISNULL(Haber, 0)

o

SUM(ISNULL(Debe, 0) - ISNULL(Haber, 0))



Carlos M. Calvelo escribió:
Mostrar la cita
Salu2 Rafael Cano
rcanop(arroba)yahoo.es
Jaén - España
Villamartín - Cádiz - España
Ads by Google
Search Busqueda sugerida