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

#6 Carlos M. Calvelo
21/05/2008 - 09:19 | Informe spam
Hola Rafael,

On 21 mei, 09:08, Rafael Cano wrote:
No deberia ser:
SUM(ISNULL(Debe, 0)) - SUM(ISNULL(Haber, 0)

o

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




Tus propuestas darán null en vez de 0 cuando el número
de registros a sumar es 0.
Además ejecutaran innecesariamente un ISNULL
por registro. Lo que yo propongo solo una vez por suma.

Puedes poner un ejemplo donde tus propuestas den un
resultado correcto y lo que yo propongo no?

Saludos,
Carlos
Respuesta Responder a este mensaje
#7 Rafael Cano
21/05/2008 - 09:56 | Informe spam
Entonces sería así:
ISNULL(SUM(ISNULL(Debe, 0) - ISNULL(Haber, 0)), 0)
ó
ISNULL(SUM(ISNULL(Debe, 0)) - SUM(ISNULL(Haber, 0)), 0)

Lo digo porque entiendo que en el campo debe de algún registro hay un
NULL, de esta manera se evita un posible null en la operación de resta.

Creencia equivocada por mi parte como demuestra el script que me ha
animado a hacer Carlos. Todos los días se aprende algo.

CREATE TABLE #TablaTmp (
ID INT NOT NULL,
Debe MONEY NULL,
Haber MONEY NULL,
Saldo AS Debe - Haber,
Saldo2 AS ISNULL(Debe, 0) - ISNULL(Haber, 0)
);
INSERT #TablaTmp (Id, Debe, Haber)
VALUES (1, 10, 5);
INSERT #TablaTmp (Id, Debe, Haber)
VALUES (2, 20, 10);
INSERT #TablaTmp (Id, Debe, Haber)
VALUES (3, NULL, 5);
INSERT #TablaTmp (Id, Debe, Haber)
VALUES (4, 10, NULL);
INSERT #TablaTmp (Id, Debe, Haber)
VALUES (5, NULL, NULL);

SELECT * FROM #TablaTmp;
SELECT SUM(ISNULL(Debe, 0) - ISNULL(Haber, 0)) SaldoCal FROM #TablaTmp;
SELECT SUM(ISNULL(Debe, 0) - ISNULL(Haber, 0)) SaldoCal FROM #TablaTmp
WHERE id > 10; -- Sale KO
SELECT ISNULL(SUM(ISNULL(Debe, 0) - ISNULL(Haber, 0)), 0) SaldoCal FROM
#TablaTmp WHERE id > 10; -- Sale OK


SELECT ISNULL(SUM(debe)-SUM(haber),0) SaldoCal FROM #TablaTmp ; -- Sale OK
SELECT ISNULL(SUM(debe)-SUM(haber),0) SaldoCal FROM #TablaTmp WHERE id >
10; -- Sale OK
DROP TABLE #TablaTmp;




Carlos M. Calvelo escribió:
Hola Rafael,

On 21 mei, 09:08, Rafael Cano wrote:
No deberia ser:
SUM(ISNULL(Debe, 0)) - SUM(ISNULL(Haber, 0)

o

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




Tus propuestas darán null en vez de 0 cuando el número
de registros a sumar es 0.
Además ejecutaran innecesariamente un ISNULL
por registro. Lo que yo propongo solo una vez por suma.

Puedes poner un ejemplo donde tus propuestas den un
resultado correcto y lo que yo propongo no?

Saludos,
Carlos



Salu2 Rafael Cano
rcanop(arroba)yahoo.es
Jaén - España
Villamartín - Cádiz - España
Respuesta Responder a este mensaje
#8 Carlos M. Calvelo
21/05/2008 - 10:25 | Informe spam
Rafael,

On 21 mei, 09:56, Rafael Cano wrote:
Entonces sería así:
ISNULL(SUM(ISNULL(Debe, 0) - ISNULL(Haber, 0)), 0)
ó
ISNULL(SUM(ISNULL(Debe, 0)) - SUM(ISNULL(Haber, 0)), 0)



ISNULL(SUM(Debe),0) - ISNULL(SUM(Haber),0)
es suficiente.


Lo digo porque entiendo que en el campo debe de algún registro hay un
NULL, de esta manera se evita un posible null en la operación de resta.

Creencia equivocada por mi parte como demuestra el script que me ha
animado a hacer Carlos. Todos los días se aprende algo.

CREATE TABLE #TablaTmp (
        ID INT NOT NULL,
        Debe MONEY NULL,
        Haber MONEY NULL,
        Saldo AS Debe - Haber,
        Saldo2 AS ISNULL(Debe, 0) - ISNULL(Haber, 0)
);
INSERT #TablaTmp (Id, Debe, Haber)
        VALUES (1, 10, 5);
INSERT #TablaTmp (Id, Debe, Haber)
        VALUES (2, 20, 10);
INSERT #TablaTmp (Id, Debe, Haber)
        VALUES (3, NULL, 5);
INSERT #TablaTmp (Id, Debe, Haber)
        VALUES (4, 10, NULL);
INSERT #TablaTmp (Id, Debe, Haber)
        VALUES (5, NULL, NULL);

SELECT * FROM #TablaTmp;
SELECT SUM(ISNULL(Debe, 0) - ISNULL(Haber, 0)) SaldoCal FROM #TablaTmp;
SELECT SUM(ISNULL(Debe, 0) - ISNULL(Haber, 0)) SaldoCal FROM #TablaTmp
WHERE id > 10; -- Sale KO
SELECT ISNULL(SUM(ISNULL(Debe, 0) - ISNULL(Haber, 0)), 0) SaldoCal FROM
#TablaTmp WHERE id > 10; -- Sale OK

SELECT ISNULL(SUM(debe)-SUM(haber),0) SaldoCal FROM #TablaTmp ; -- Sale OK
SELECT ISNULL(SUM(debe)-SUM(haber),0) SaldoCal FROM #TablaTmp WHERE id >
10; -- Sale OK
DROP TABLE #TablaTmp;




No. Yo digo ISNULL(SUM(debe),0) - ISNULL(SUM(haber),0)

Porqué?
Con ISNULL(SUM(debe)-SUM(haber),0) si tenemos
el caso de que al menos un debe no es null y todos
los haber son null esto resultaría en (digamos que los
debe son en total 100):

ISNULL( 100 - null, 0)
que es igual a
ISNULL(null,0)
que es
0

pero el resultado tendría que haber sido 100.


Saludos,
Carlos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida