Usuário com melhor resposta
Select que verifica parametro de entrada

Pergunta
-
Olá Pessoal.
Gente, precisava criar um select que esta muito complicado(pelo menos para mim).
é o seguinte:
Estou desenvolvendo uma tela de busca de Pneus onde a pessoa pode escolher buscar pela placa do veiculo ou pelo numero de matricula do pneu.
ela deve escolher um ou outro, eu tenho que fazer uma procedure que verifique qual opção foi escolhida para retornar a informação....pois se a pessoa escolher a busca pela placa, eu retornarei todos os pneus daquele veiculo, se ela escolher a matricula eu retorno somente o pneu da matricula selecionada.
A questão é, como fazer um select que verifique qual parametro usar para retornar um valor?
abraço.
Respostas
-
hcosta,
se vc testa se a variável é NULA, vc tem que permitir que ela o seja. Também estava faltando um END no final.
Tente este código:
CREATE
PROCEDURE SP_FM_LOADTIRESINFORMATIONBYFILTERSELECTED(
@REGISTER VARCHAR
(10)=NULL, --IMPORTANTE@VEHICLEID
INT=NULL --IMPORTANTE)
AS
SET
NOCOUNT ONBEGIN
IF
UPPER(@REGISTER) IN NOT NULLBEGIN
SELECTVEI
.IDVEICULO AS VEHICLEID,VEI
.PLACA AS PLATE,PNEVEI
.IDEIXOPOSICAO AS EIXOPOSITIONID,PNE
.MATRICULA AS REGISTER,PNE
.FOGO AS FIRE,PNEMAN
.NOTAFISCAL AS FISCALNOTE,PNE
.DATAVENCIMENTOGARANTIA AS GARANTEEMATURITYDATE,PNEMAR
.MARCA AS MARK,FORN
.RAZAOSOCIAL AS SUPPLIER,PNEVEI
.KMALOCACAO AS INITIALKM FROMTBFM_PNEUS
AS PNE,TBFM_PNEUSVEICULOS
AS PNEVEI,TBGE_VEICULOS
AS VEI,TBFM_POSICOESEIXOS
AS POSEIX,TBFM_PNEUSMARCAS
AS PNEMAR,TBGE_FORNECEDORES
AS FORN,TBFM_PNEUSMANUTENCOES
AS PNEMAN WHERE PNE.MATRICULA = @REGISTER AND VEI.IDVEICULO = PNEVEI.IDVEICULO AND PNEVEI.IDEIXOPOSICAO = POSEIX.IDEIXOPOSICAO AND PNE.IDFORNECEDOR = FORN.IDFORNECEDOR AND PNE.IDMARCA = PNEMAR.IDMARCA ORDER BY MATRICULAEND
ELSE
BEGIN
SELECTVEI
.IDVEICULO AS VEHICLEID,VEI
.PLACA AS PLATE,PNEVEI
.IDEIXOPOSICAO AS EIXOPOSITIONID,PNE
.MATRICULA AS REGISTER,PNE
.FOGO AS FIRE,PNEMAN
.NOTAFISCAL AS FISCALNOTE,PNE
.DATAVENCIMENTOGARANTIA AS GARANTEEMATURITYDATE,PNEMAR
.MARCA AS MARK,FORN
.RAZAOSOCIAL AS SUPPLIER,PNEVEI
.KMALOCACAO AS INITIALKM FROMTBFM_PNEUS
AS PNE,TBFM_PNEUSVEICULOS
AS PNEVEI,TBGE_VEICULOS
AS VEI,TBFM_POSICOESEIXOS
AS POSEIX,TBFM_PNEUSMARCAS
AS PNEMAR,TBGE_FORNECEDORES
AS FORN,TBFM_PNEUSMANUTENCOES
AS PNEMAN WHERE VEI.IDVEICULO = @VEHICLEID AND VEI.IDVEICULO = PNEVEI.IDVEICULO AND PNEVEI.IDEIXOPOSICAO = POSEIX.IDEIXOPOSICAO AND PNE.IDFORNECEDOR = FORN.IDFORNECEDOR AND PNE.IDMARCA = PNEMAR.IDMARCA ORDER BY MATRICULAEND
Todas as Respostas
-
-
Bom dia
A solução mais simples é fazer isso através de uma procedure, dá uma olhada no exemplo
Create
Procedure usp_BuscaPneus(@codigo varchar(10),@tipo char(1)) asBegin
If Upper(@tipo) = 'M' -- Busca Matrícula BeginSelet CAMPOS
From SUATABELA Where Matricula = @codigo End Else BeginSelet CAMPOS
From SUATABELA Where Codigo = @codigo EndEnd
GO
-
-
Minha Procedure esta assim:
CREATE PROCEDURE SP_FM_LOADTIRESINFORMATIONBYFILTERSELECTED
(
@REGISTER VARCHAR(10),
@VEHICLEID INT
)
ASBEGIN
IF UPPER(@REGISTER) IN NOT NULL
BEGIN
SELECT
VEI.IDVEICULO AS VEHICLEID,
VEI.PLACA AS PLATE,
PNEVEI.IDEIXOPOSICAO AS EIXOPOSITIONID,
PNE.MATRICULA AS REGISTER,
PNE.FOGO AS FIRE,
PNEMAN.NOTAFISCAL AS FISCALNOTE,
PNE.DATAVENCIMENTOGARANTIA AS GARANTEEMATURITYDATE,
PNEMAR.MARCA AS MARK,
FORN.RAZAOSOCIAL AS SUPPLIER,
PNEVEI.KMALOCACAO AS INITIALKM
FROM
TBFM_PNEUS AS PNE,
TBFM_PNEUSVEICULOS AS PNEVEI,
TBGE_VEICULOS AS VEI,
TBFM_POSICOESEIXOS AS POSEIX,
TBFM_PNEUSMARCAS AS PNEMAR,
TBGE_FORNECEDORES AS FORN,
TBFM_PNEUSMANUTENCOES AS PNEMAN
WHERE
PNE.MATRICULA = @REGISTER
AND VEI.IDVEICULO = PNEVEI.IDVEICULO
AND PNEVEI.IDEIXOPOSICAO = POSEIX.IDEIXOPOSICAO
AND PNE.IDFORNECEDOR = FORN.IDFORNECEDOR
AND PNE.IDMARCA = PNEMAR.IDMARCA
ORDER BYMATRICULA
END
ELSE
BEGIN
SELECTVEI.IDVEICULO AS VEHICLEID,
VEI.PLACA AS PLATE,
PNEVEI.IDEIXOPOSICAO AS EIXOPOSITIONID,
PNE.MATRICULA AS REGISTER,
PNE.FOGO AS FIRE,
PNEMAN.NOTAFISCAL AS FISCALNOTE,
PNE.DATAVENCIMENTOGARANTIA AS GARANTEEMATURITYDATE,
PNEMAR.MARCA AS MARK,
FORN.RAZAOSOCIAL AS SUPPLIER,
PNEVEI.KMALOCACAO AS INITIALKM
FROM
TBFM_PNEUS AS PNE,
TBFM_PNEUSVEICULOS AS PNEVEI,
TBGE_VEICULOS AS VEI,
TBFM_POSICOESEIXOS AS POSEIX,
TBFM_PNEUSMARCAS AS PNEMAR,
TBGE_FORNECEDORES AS FORN,
TBFM_PNEUSMANUTENCOES AS PNEMAN
WHERE
VEI.IDVEICULO = @VEHICLEID
AND VEI.IDVEICULO = PNEVEI.IDVEICULO
AND PNEVEI.IDEIXOPOSICAO = POSEIX.IDEIXOPOSICAO
AND PNE.IDFORNECEDOR = FORN.IDFORNECEDOR
AND PNE.IDMARCA = PNEMAR.IDMARCA
ORDER BYMATRICULA
Go
Não funciona corretamente....
-
hcosta,
se vc testa se a variável é NULA, vc tem que permitir que ela o seja. Também estava faltando um END no final.
Tente este código:
CREATE
PROCEDURE SP_FM_LOADTIRESINFORMATIONBYFILTERSELECTED(
@REGISTER VARCHAR
(10)=NULL, --IMPORTANTE@VEHICLEID
INT=NULL --IMPORTANTE)
AS
SET
NOCOUNT ONBEGIN
IF
UPPER(@REGISTER) IN NOT NULLBEGIN
SELECTVEI
.IDVEICULO AS VEHICLEID,VEI
.PLACA AS PLATE,PNEVEI
.IDEIXOPOSICAO AS EIXOPOSITIONID,PNE
.MATRICULA AS REGISTER,PNE
.FOGO AS FIRE,PNEMAN
.NOTAFISCAL AS FISCALNOTE,PNE
.DATAVENCIMENTOGARANTIA AS GARANTEEMATURITYDATE,PNEMAR
.MARCA AS MARK,FORN
.RAZAOSOCIAL AS SUPPLIER,PNEVEI
.KMALOCACAO AS INITIALKM FROMTBFM_PNEUS
AS PNE,TBFM_PNEUSVEICULOS
AS PNEVEI,TBGE_VEICULOS
AS VEI,TBFM_POSICOESEIXOS
AS POSEIX,TBFM_PNEUSMARCAS
AS PNEMAR,TBGE_FORNECEDORES
AS FORN,TBFM_PNEUSMANUTENCOES
AS PNEMAN WHERE PNE.MATRICULA = @REGISTER AND VEI.IDVEICULO = PNEVEI.IDVEICULO AND PNEVEI.IDEIXOPOSICAO = POSEIX.IDEIXOPOSICAO AND PNE.IDFORNECEDOR = FORN.IDFORNECEDOR AND PNE.IDMARCA = PNEMAR.IDMARCA ORDER BY MATRICULAEND
ELSE
BEGIN
SELECTVEI
.IDVEICULO AS VEHICLEID,VEI
.PLACA AS PLATE,PNEVEI
.IDEIXOPOSICAO AS EIXOPOSITIONID,PNE
.MATRICULA AS REGISTER,PNE
.FOGO AS FIRE,PNEMAN
.NOTAFISCAL AS FISCALNOTE,PNE
.DATAVENCIMENTOGARANTIA AS GARANTEEMATURITYDATE,PNEMAR
.MARCA AS MARK,FORN
.RAZAOSOCIAL AS SUPPLIER,PNEVEI
.KMALOCACAO AS INITIALKM FROMTBFM_PNEUS
AS PNE,TBFM_PNEUSVEICULOS
AS PNEVEI,TBGE_VEICULOS
AS VEI,TBFM_POSICOESEIXOS
AS POSEIX,TBFM_PNEUSMARCAS
AS PNEMAR,TBGE_FORNECEDORES
AS FORN,TBFM_PNEUSMANUTENCOES
AS PNEMAN WHERE VEI.IDVEICULO = @VEHICLEID AND VEI.IDVEICULO = PNEVEI.IDVEICULO AND PNEVEI.IDEIXOPOSICAO = POSEIX.IDEIXOPOSICAO AND PNE.IDFORNECEDOR = FORN.IDFORNECEDOR AND PNE.IDMARCA = PNEMAR.IDMARCA ORDER BY MATRICULAEND
-