SQL Server - Problema con cadena

 
Vista:

Problema con cadena

Publicado por Carlos Restrepo (61 intervenciones) el 22/05/2007 21:18:35
Hola a todos

una pregunta, como puedo hacer para que ejecutando un solo select pueda sacar los datos de una tabla dependiendo de una condicion especifica.

El caso es el siguiente, si se cumple que la variable @v_LPAYONDEL es mayor a cero, en el where de la consulta debo de buscar por un campo, pero si es la variable es menor op igual a cero debo buscar por otro.

Trata de hacerlo metiendo todo en una cadena de texto y utilizando el exec, pero no me funciona, parece ser que la cadena es demasiad larga.

De todas formas quisiera saber como puedo hacer esto sin tener que hacer un if que me obligaria a tener 2 consultas, quiero evitar tanto codigo, espero haberme hecho entender

Adjunto el codigo

IF @V_LPAYONDEL>0
BEGIN
SET @V_STRWHERE='where CCARID='+''''+@PI_CCARRIER+''''+' and ctrnsta <> ''04'' and DDELDATE>='+''''+convert(varchar(20),@V_DCLOSEDBAL,101)+''''+' and DDELDATE<=getdate()+1 AND mtreme01.csercode=SMSVCS00.csercode '
END
ELSE
BEGIN
SET @V_STRWHERE='where CCARID='+''''+@PI_CCARRIER+''''+' and ctrnsta <> ''04'' and DCARDATE>='+''''+convert(varchar(20),@V_DCLOSEDBAL,101)+''''+' and DCARDATE<=getdate()+1 AND mtreme01.csercode=SMSVCS00.csercode '
END

EXEC ('UPDATE ACTRNSERAP_SQL SET CCARRIER=GRAL.CCARID,DTRNDATE=GRAL.DTRNDATE,CSERVICE=GRAL.CSERCODE, CSERNAME=GRAL.CSERNAME,YTRNTOT=GRAL.ycarbal, CREC_INI=GRAL.lcRINITIAL,CREC_LAS=GRAL.lcRFINAL FROM ACTRNSERAP_SQL AP INNER JOIN(SELECT SUM(yusaamt+ycarcomm) AS ycarbal,MIN(CCARCONS) AS lcRINITIAL,MAX(CCARCONS) AS lcRFINAL,CCARID,DTRNDATE,SMSVCS00.csercode,SMSVCS00.CSERNAME FROM MTREME01, SMSVCS00 '+''''+@V_STRWHERE+''''+'GROUP BY CCARID,DTRNDATE,SMSVCS00.CSERCODE,SMSVCS00.CSERNAME)GRAL ON AP.CCARRIER=GRAL.CCARID AND AP.DTRNDATE=GRAL.DTRNDATE');
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con cadena

Publicado por Isaías (3308 intervenciones) el 23/05/2007 00:07:39
/* Para probar
DECLARE @PI_CCARRIER CHAR(5)
DECLARE @V_DCLOSEDBAL DATETIME
DECLARE @V_LPAYONDEL INT
SET @V_LPAYONDEL = 9
SET @V_DCLOSEDBAL = GETDATE()
SET @PI_CCARRIER = 'HOLA'
*/
DECLARE @SQLString NVARCHAR(3000)
SET @SQLString = N'UPDATE ACTRNSERAP_SQL
SET CCARRIER=GRAL.CCARID,
DTRNDATE=GRAL.DTRNDATE,
CSERVICE=GRAL.CSERCODE,
CSERNAME=GRAL.CSERNAME,
YTRNTOT=GRAL.ycarbal,
CREC_INI=GRAL.lcRINITIAL,
CREC_LAS=GRAL.lcRFINAL
FROM ACTRNSERAP_SQL AP INNER JOIN
(SELECT SUM(yusaamt+ycarcomm) AS ycarbal,
MIN(CCARCONS) AS lcRINITIAL,
MAX(CCARCONS) AS lcRFINAL,
CCARID,
DTRNDATE,
SMSVCS00.csercode,
SMSVCS00.CSERNAME
FROM MTREME01, SMSVCS00 '+
' WHERE CCARID= '+CHAR(39)+@PI_CCARRIER+CHAR(39)+' AND ctrnsta <> ''04'' AND '+
CASE WHEN @V_LPAYONDEL > 0 THEN ' DDELDATE>= ' ELSE 'DCARDATE>=' END +
CHAR(39)+ convert(varchar(20),@V_DCLOSEDBAL,101)+ CHAR(39)+ ' AND DDELDATE<=getdate()+1 AND mtreme01.csercode=SMSVCS00.csercode '
-- PRINT @SQLString
EXECUTE SP_EXECUTESQL @SQLString
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Gracias isaias

Publicado por Carlos Restrepo (61 intervenciones) el 23/05/2007 00:11:41
Isaias Gracias

lo voy a probar y te cuento

carlos restrepo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Gracias isaias

Publicado por Isaías (3308 intervenciones) el 23/05/2007 01:32:21
De nada Carlos

Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Isaias No funciono

Publicado por Carlos Restrepo (61 intervenciones) el 23/05/2007 15:39:28
Hola isaias

te comento que no funciono, aqui te muestro el codigo que estoy utilizando, para ver si en vez de cadena puedo utilizar directamente el case dentro del where

declare @V_LPAYONDEL int
set @V_LPAYONDEL=1
SELECT CCARID, DTRNDATE, SMSVCS00.csercode,
SMSVCS00.CSERNAME,SUM(yusaamt+ycarcomm) AS ycarbal,
MIN(CCARCONS) AS lcRINITIAL,
MAX(CCARCONS) AS lcRFINAL,cpshost,'02','Y','Y'
FROM MTREME01, SMSVCS00
where CCARID='R0066'
and ctrnsta <> '04'
and (CASE WHEN @V_LPAYONDEL>0 THEN DCARDATE between '2006-12-31 00:00:00.000' and '2006-12-31 00:00:00.000'+1 ELSE DDELDATE between '2006-12-31 00:00:00.000' and '2006-12-31 00:00:00.000'+1)
AND mtreme01.csercode=SMSVCS00.csercode
GROUP BY CCARID,DTRNDATE,SMSVCS00.CSERCODE,
SMSVCS00.CSERNAME, cpshost


gracias por tu valiosa colaboracion

Carlos Restrepo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ya lo solucione

Publicado por Carlos Restrepo (61 intervenciones) el 23/05/2007 17:53:30
Hola Isaias gracias por tu ayuda, pero ya solucione el problema, con cadenas pero con otra logica, sin embargo me gustaria saber si en un where se puede introducir una clausula case.


Gracias

Carlos Restrepo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ya lo solucione

Publicado por Isaias (3308 intervenciones) el 23/05/2007 19:43:25
Si, por ejemplo, si quiero buscar en 3 campos NOMBRE, PATERNO, MATERNO y el usuario puede enviar cualquier campo, por ejemplo: PATERNO = SANCHEZ

WHERE NOMBRE LIKE CASE WHEN @NOMBRES IS NULL THEN '%' ELSE @NOMBRE+'%' END
PATERNO LIKE CASE WHEN @PATERNO IS NULL THEN '%' ELSE @PATERNO+'%' END
PATERNO LIKE CASE WHEN @PATERNO IS NULL THEN '%' ELSE @PATERNO+'%' END

Este es un simple ejemplo de como se puede incorporar un CASE en un WHERE.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar