[RESOLVIDO] Função em SQL SERVER + VAriavel vazia

RicAlmeida

Power Member
Boas,

Por exemplo eu tenho 8 variaveis, so que nem todas sao preenchidas e tenho que fazer todas as formas possiveis para fazer a pesquisa. so que se nao preencher as variaveis todas ele nao me retorna alguma coisa.

O que eu pretendo e se existe alguma maneira de contornar isso caso essa variavek estiver vazia ele nao liga i para para outra variavel.
 
mostra a query que estás a usar, por favor ;)

neste momento estou a fazer isto

Código:
declare @cliente char(50), @vendedor char(50), @tipo char(50),@qualidade char(50),@espessura char(50), @largura char(50),@comprimento char(50),@zona char(50)

set @cliente=#1#
set @vendedor=#2#
set @tipo=#3#
set @qualidade=#4#
set @espessura=#5#
set @largura=#6#
set @comprimento=#7#
set @zona=#8#

SELECT Bo.nome as 'cliente', Bi.design as 'designacao', Bi.u_qttenc as 'qtt_enc', bi.qtt2 as 'qtt_entrega',bi.usrdata as 'prazo_entrega', bi.dedata as 'data_entrega', Bo.vendnm as 'vendedor', bo.u_obs as 'obs', BI.lobs as 'ot', Bo.obranome as 'req_cliente', Bi.lobs2 as 'doc_destino','rohs'=(case when BI.u_rohs=0 then ' ' ELSE 'X' END), Bi.debito as 'preco', BI.u_nintcert as 'n_certificado',Bo.zona as 'zona', bi.u_tpcertif as 'tp_certificado' FROM Bo inner join BI on Bo.obrano=Bi.obrano where Bo.ndos='1'and bi.ndos='1' and BO.nome=@cliente+'%' and Bo.vendnm=@vendedor and Bi.familia=@tipo and bi.u_qualid=@qualidade and bi.u_espes=@espessura and bi.u_larg=@largura and bi.u_comp=@comprimento and BO.zona=@zona
 
nesse caso vais ter que usar condições para criares o "Select" correcto. Ou trocas o operador "and" por "or", mas aí irá, provavelmente, alterar o resultado esperado.
Link: If...Else
 
Última edição:
uma das hipoteses e fazer tipo if's pa mostrar todas as condições so que isto da-me muitas mas mesmo muitas condições

trocando o operador de and por or funcionaram em condições
 
nao podes criar uma string que te vá construindo a query correcta?
Assim "só" tens 7 ifs, em vez de um if para cada uma das 5040 querys possiveis.
Também podes usar um "case" para te ir gerando a SQL-string e depois corres essa string com o comando "Execute" ;)

cumps
 
String concatenation
Execute

Se eu percebi bem, o que terás que fazer será assim mas em T-SQL ;)
Código:
strSQL = "Select * FROM Tabela where "
Se var1 !="" então 
   strSQL = strSQL + "campo1='asd'"
Fim se
Se var2 !="" então 
   strSQL = strSQL + "campo2='asd'"
Fim se

Executar strSQL
 
Devia de funcionar. Já fiz algumas funções no SQL Server com recurso a técnica que o Armadillo descreveu e funciona.

Que erro é que te dá? Faz um @print da query e confirma se está direita
 
O que tou a fazer e isto:
Código:
declare @cliente varchar(50), @vendedor varchar(50), @tipo varchar(50),@qualidade varchar(50),@espessura varchar(50), @largura varchar(50),@comprimento varchar(50),@zona varchar(50)

set @cliente=#1#
set @vendedor=#2#
set @tipo=#3#
set @qualidade=#4#
set @espessura=#5#
set @largura=#6#
set @comprimento=#7#
set @zona=#8#

strSQL="SELECT  Bo.nome as 'cliente', Bi.design as 'designacao', Bi.u_qttenc as 'qtt_enc', bi.qtt2 as 'qtt_entrega',bi.usrdata as 'prazo_entrega', bi.dedata as 'data_entrega', Bo.vendnm as 'vendedor', bo.u_obs as 'obs', BI.lobs as 'ot', Bo.obranome as 'req_cliente', Bi.lobs2 as 'doc_destino','rohs'=(case when BI.u_rohs=0 then ' ' ELSE 'X' END), Bi.debito as 'preco', BI.u_nintcert as 'n_certificado',Bo.zona as 'zona', bi.u_tpcertif as 'tp_certificado' FROM Bo inner join BI on Bo.obrano=Bi.obrano where Bo.ndos='1'and bi.ndos='1'")

if (@cliente<>'') 
    strsql=strsql+" and BO.nome=@cliente+'%"
end if

if (@vendedor<>'') 
    strsql=strsql+" and Bo.vendnm=@vendedor"
end if

if (@tipo<>'') 
    strsql=strsql+" and Bi.familia=@tipo"
end if 

if (@qualidade<>'') 
    strsql=strsql+" and bi.u_qualid=@qualidade"
end if

if (@espessura!='') 
    strsql=strsql+" and bi.u_espess>=@espessura"
end if

if (@largura!='') 
    strsql=strsql+" and bi.u_largura>=@largura"
end if

if (@comprimento!='') 
    strsql=strsql+" and bi.u_comp>=@comprimento"
end if 

if (@zona!='') 
    strsql=strsql+" and BO.zona=@zona"
end if

Exec strsql

o erro que me esta a dar e este
Msg 102, Level 15, State 1, Line 12
Incorrect syntax near 'strSQL'.
Msg 103, Level 15, State 4, Line 12
The identifier that starts with 'SELECT Bo.nome as 'cliente', Bi.design as 'designacao', Bi.u_qttenc as 'qtt_enc', bi.qtt2 as 'qtt_entrega',bi.usrdata as 'prazo' is too long. Maximum length is 128.
Msg 102, Level 15, State 1, Line 15
Incorrect syntax near 'strsql'.
Msg 102, Level 15, State 1, Line 19
Incorrect syntax near 'strsql'.
Msg 102, Level 15, State 1, Line 23
Incorrect syntax near 'strsql'.
Msg 102, Level 15, State 1, Line 27
Incorrect syntax near 'strsql'.
Msg 102, Level 15, State 1, Line 31
Incorrect syntax near 'strsql'.
Msg 102, Level 15, State 1, Line 35
Incorrect syntax near 'strsql'.
Msg 102, Level 15, State 1, Line 39
Incorrect syntax near 'strsql'.
Msg 102, Level 15, State 1, Line 43
Incorrect syntax near 'strsql'.
 
Eu arranjei outra maneira de o fazer, e ao que parece para os efeitos e melhor para os utilizador trabalharem assim


Código:
declare @cliente varchar(50), @vendedor varchar(50), @tipo varchar(50),@qualidade varchar(50),@espessura numeric(10,3), @largura numeric(10,3),@comprimento numeric(10,3),@zona varchar(50)

set @cliente=#1#
set @vendedor=#2#
set @tipo=#3#
set @qualidade=#4#
set @espessura=#5#
set @largura=#6#
set @comprimento=#7#
set @zona=#83



select BO.vendedor as 'codvendedor', Bi.familia as 'familia', BI.u_largura as 'Largura', Bi.u_espess as 'espessura',Bi.u_qualid as 'qualidade', BI.u_comp as 'comprimento', Bo.nome as 'cliente', Bi.design as 'designacao', Bi.u_qttenc as 'qtt_enc', bi.qtt2 as 'qtt_entrega',bi.usrdata as 'prazo_entrega', bi.dedata as 'data_entrega', Bo.vendnm as 'vendedor', bo.u_obs as 'obs', BI.lobs as 'ot', Bo.obranome as 'req_cliente', Bi.lobs2 as 'doc_destino','rohs'=(case when BI.u_rohs=0 then ' ' ELSE 'X' END), Bi.debito as 'preco', BI.u_nintcert as 'n_certificado',Bo.zona as 'zona', bi.u_tpcertif as 'tp_certificado' from BO inner join BI on Bo.obrano=Bi.obrano where Bi.ndos='1' and Bo.ndos='1' and bo.nome like @cliente+'%' and bo.vendnm like @vendedor+'%' and bi.familia like @tipo+'%' and bi.u_qualid like @qualidade+'%' and bi.u_espess>=@espessura and BI.u_largura>=@largura and bi.u_comp>=@comprimento and bo.zona like @zona+'%'

Obrigado pela a ajuda na mesma
 
Back
Topo