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:

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



Respuesta Responder a este mensaje
#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:
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:

> 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...
>
>
>
Respuesta Responder a este mensaje
#3 Carlos M. Calvelo
21/05/2008 - 08:19 | Informe spam
Hola Francisco,

On 20 mei, 23:26, "Francisco" wrote:
Bueno de todas formas ya le he encontre la
solucion claro que tuve que hacer 2 SELECT en vez de una que esperaba.




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
Respuesta Responder a este mensaje
#4 Carlos M. Calvelo
21/05/2008 - 09:01 | Informe spam
Hola,

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




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

Saludos,
Carlos
Respuesta Responder a este mensaje
#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ó:
Hola,

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




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

Saludos,
Carlos



Salu2 Rafael Cano
rcanop(arroba)yahoo.es
Jaén - España
Villamartín - Cádiz - España
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida