SQL Server - sentencia para condicionar variables

 
Vista:

sentencia para condicionar variables

Publicado por lucas verdugo (5 intervenciones) el 14/04/2011 20:59:49
Estimados todos:

Estoy intentando preparar una consulta dinamica que contiene 4 variables de busqueda en una misma base de datos:

declare @numero_documento as float
declare @patente as varchar(1000)
declare @motor as varchar(1000)
declare @chasis as varchar(1000)

set @numero_documento = 25024032
set @patente = 'ICV-535'
set @motor = 'T85013338'
set @chasis = '8AGSB19Y0AR108825'

necesito unificar los resultados con UNIONES

select
'asegurado' as persona,
'no asigna' as patente,
'no asigna' as motor,
'no asigna' as chasis,
* from TABLA
where convert(float,DOC_ASE) = @numero_documento
union
select
'propietario' as persona,
'no asigna' as patente,
'no asigna' as motor,
'no asigna' as chasis,
* from TABLA
where convert(float,DOC_PRO) = @numero_documento
union
select
'no asigna' as persona,
'asegurado' as patente,
'no asigna' as motor,
'no asigna' as chasis,
* from TABLA
where PAT_ASE = @patente
union
select
'no asigna' as persona,
'tercero' as patente,
'no asigna' as motor,
'no asigna' as chasis,
* from TABLA
where PAT_TER = @patente

UNION

select
'no asigna' as persona,
'no asigna' as patente,
'asegurado' as motor,
'no asigna' as chasis,
* from TABLA
where NUM_MOT_ASE = @motor
union
select
'no asigna' as persona,
'no asigna' as patente,
'tercero' as motor,
'no asigna' as chasis,
* from TABLA
where NUM_MOT_TER = @motor

UNION

select
'no asigna' as persona,
'no asigna' as patente,
'no asigna' as motor,
'asegurado' as chasis,
* from TABLA
where NUM_CHA_ASE = @chasis
union
select
'no asigna' as persona,
'no asigna' as patente,
'no asigna' as motor,
'tercero' as chasis,
* from TABLA
where NUM_CHA_TER = @chasis

El caso es que MUCHAS VECES SOLO ME PIDEN CONSULTAR POR UN SOLO PARAMETRO Y NO POR TODOS AL MISMO TIEMPO.

el caso sería que cuando:

set @numero_documento = 25024032 (este completo)
set @patente = '' (no tenga el dato)
set @motor = '' (no tenga el dato)
set @chasis = '' (no tenga el dato)

me ejecute solamente la parte de la consulta referente a tipo de documento.

para condicionar la busqueda pense en storear los procedimientos por separado, declarando la variable pero no seteandola luego:

declare @numero_documento as float
set @numero_documento = '22222222'
exec (consulta_persona)

en el ejemplo de documento cree este procedimiento:

create procedure consulta_persona as
declare @numero_documento as float
select
'asegurado' as persona,
'no asigna' as patente,
'no asigna' as motor,
'no asigna' as chasis,
* from TABLA
where convert(float,DOC_ASE) = @numero_documento
union
select
'propietario' as persona,
'no asigna' as patente,
'no asigna' as motor,
'no asigna' as chasis,
* from TABLA
where convert(float,DOC_PRO) = @numero_documento
union
select
'conductor' as persona,
'no asigna' as patente,
'no asigna' as motor,
'no asigna' as chasis,
* from TABLA
where convert(float,NUM_DOC_CON) = @numero_documento
union
select
'tercero' as persona,
'no asigna' as patente,
'no asigna' as motor,
'no asigna' as chasis,
* from TABLA
where convert(float,NUM_DOC_TER) = @numero_documento
union
select
'productor' as persona,
'no asigna' as patente,
'no asigna' as motor,
'no asigna' as chasis,
* from FROM TABLA
where convert(float,NUM_DOC_PROD) = @numero_documento)
end

ETC
ETC
ETC

go

EL TEMA ES QUE EL PROCEDURE NO ME TOMO EL DATO DE LA VARIABLE DECLARADA ANTERIORMENTE

COMO PUEDO SOLUCIONAR ESTE PROBLEMA?

gracias
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
sin imagen de perfil

sentencia para condicionar variables

Publicado por Juan Manuel Cruz (59 intervenciones) el 18/04/2011 19:03:30
También podrías, ya dentro del procedimiento, recibiendo parámetros y todo eso, permitir que un parámetro pueda recibirse con valor NULL incluso y luego en la consulta...

CREATE PROCEDURE MiConsulta
@codigo varchar(10)=NULL
@familia varchar(10)=NULL
AS
BEGIN
SELECT * FROM MiTabla
WHERE case
when @codigo is null then 1
when mitabla.codigo= @codigo then 1
else 0
end=1
AND case
when @familia is null then 1
when mitabla.familia= @familia then 1
else 0
end=1
END

(retorcido razonamiento mental: Si el codigo es nulo, hago un 1=1 que siempre será verdadero, pero si el código tiene valor diferente de nulo, lo comparo con el campo respectivo y dependiendo de la comparación habrá un 0=1, o sea que no, o un 1=1 o sea que sí...)

Así te ahorras de hacer múltiples consultas, tienes un único procedimiento parametrizado con parámetros opcionales y con valor por defecto.
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
sin imagen de perfil

sentencia para condicionar variables

Publicado por Juan Manuel Cruz (59 intervenciones) el 15/04/2011 14:39:29
En la declaración del procedimiento debes declarar @numerodocumento como un parámetro del mismo, no como una variable local.

CREATE PROCEDURE procedure consulta_persona
@documento as float
AS
select ... (bla bla bla...) where (bla bla bla...) = @documento (bla bla bla...)


y cuando llamas al procedimiento lo haces así, pasándole el parámetro:

EXEC procedure consulta_persona @numero_documento



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

sentencia para condicionar variables

Publicado por lucas verdugo (5 intervenciones) el 20/04/2011 01:13:24
GRACIAS A TODOS, ME DIERON UNA MUY BUENA EXPLICACION AL RESPECTO!!!!!
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

sentencia para condicionar variables

Publicado por lucas verdugo (5 intervenciones) el 15/04/2011 17:31:24
Muchas gracias, me sirvio tu sugerencia!

la verdad es que llega un punto donde se me corre el cuagulo y no puedo seguir.

Saludos!
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