Usuário com melhor resposta
Trabalhar um parametro uniqueidentifier

Pergunta
-
Amigos,
possuo uma aplicação onde passo o seguinte uniqueidentifier como parametro:'00000000-0000-0000-0000-000000000001'
Contudo gostaria de fazer uma procedure onde estivesse a seguinte condição:
IF @CodLoja = '00000000-0000-0000-0000-000000000001'
Select @CodLoja = ('2602C1E1-9843-487F-A81B-1F8967996D96', 'A840E801-8E42-4C95-A4C7-3FF333A123BE')Ou seja, eu gostaria de atribuir todos os outros uniqueidentifier na minha condição, mas não está dando certo aparece o seguinte erro:
Server: Msg 170, Level 15, State 1, Line 30
Line 30: Incorrect syntax near ','.Alquem poderia me ajudar?
Respostas
-
Daniel,
Vamos lá.
Todos nós sabemos que uma consula só é realizada, na maioria dos casos, quando as condições impostas para essa
consulta se aplicam. Não adianta eu procurar laranjas num pé de manga. MAs com certeza eu encontrarei limões num pé de Limão.
Pois bem, sendo assim uma condição para um busca é tão importante como o que quero buscar.
Sendo assim voltanso ao exemplo abstrato, eu sou dono de um pomar, esse pomar tem vários tipos de frutas.
Todos os dias eu tenho que ir para buscar as frutas. Só que eu tenho uma regra para buscar as frutas. Na segunda eu
só posso pegar as maças, as terças as laranjas, as quartas os pêssegosm as quintas, os limões, as sextas os morangos aos sábados
as amores e domingo eu ´PRECISO pegar todas as futas. Eu malandramente, construí uma máquina para buscar as frutas pra mim, só que
para ela saber quais as frutas para buscar eu preciso carregar a máquina com a fruta certa para o dia certo. Sendo assim o que ficaria
mais fácil?? Eu criar 7 rotinas para cada dia da semana ou uma única rotina que possa ser usada nos 7 dias da semana?? INCLUSIVE
NO DIA QUE TEM QUE TRAZER TODAS AS FRUTAS!!!!
Sendo assim eu resolvi fazer uma única rotina.
vou lá entro com o seguinte dado na segundaSELECIONE TODAS AS FRUTAS
QUE O NOME SEJA (AQUI EU VOU COLOCAR A FRUTA)BLZ..... JÁ RESOLVI MEU PROBLEMA!!!!!!!!!!!! UPA!!!!!!!!
OP'S É DOMINGO?? COMO VOU COLOCAR TODAS AS FRUTAS NESSA IGUALDADE SABENDO QUE SÓ PODE SER IGUAL A UMA FRUTA??
Posso colocar uma porção de ou... Ou essa ou aquela ou aquela outra. PO mas se eu quiser cultivar mais frutas vou ter que ficar
mechendo sempre nessa rotina?? e vai ficar feio e grande!!! Po fala sério.. então o que fazer??Malandramente, estou dando ênfase ao malandramente pq sou eu quem está explicando né?!?! Me dar uma moral!! srrsrsrs,
eu pensei o seguinte. Quer saber.. Quando eu não passar nennhuma fruta eu vou querer que ele pegue todas.
sendo assim só preciso igualar a fruta que está cadastrada a fruta que eu quero.
Sendo assim eu cheguei ao seguinte algorítmo.
ISNULL(fruta CADASTRADA, 0) = ISNULL(FRUTA QUE QUERO, ISNULL(fruta CADASTRADA, 0))SENDO ASSIM COMO MINHA FRUTA ESTÁ VAZIA ESSA FRUTA VAI SE TRANSAFORMAR NA FRUTA QUE ESTOU SELECINANDO NO MOMENTO.
OU SEJA..PRIMEIRO ELA SE TRASNFORMA NO SEGUINTE:
MAÇÃ = MAÇÃ (RETORNA)
LARANJA = LARANJA (RETORNA)
UVA = UVA (RETORNA)
.
.
.MARAVILHA PROBLEMA RESOLVIDO.... QUANDO EU PRECISAR DE UMA FRUTA TAL EU ENTRO COM ELA.. SENDO ASSIM FICARÁ DESSA FORMA
MAÇÃ = MAÇÃ (RETORNA)
LARANJA <> MAÇÃ (NÃO RETORNA)
UVA <> MAÇÃ (NÃO RETORNA)
.
.
.PROBLEMA RESOLVIDO SEM GASTAR CÓDIGO E MEU TEMPO. FUTURAMENTE SE EU QUISER OUTRA FRUTA SÓ CADASTRA-LA NO SISTEMA E RIR A TOA..
JÁ POSSO IR A PRAIA E TOMAR MINHA CERVEJADANIEL,
BRINCADEIRAS A PARTE, não se ofenda com a analogia. Só achei que dessa forma seria melhor par entendimento.
Qualquer parada não se acanhe e volte a perguntar..Abraçoi,
Todas as Respostas
-
Boa Tarde,
Provavelmente você terá que trabalhar com eles utilizando alguma tabela. Você não conseguirá passar múltiplos valores para uma única variável (a menos que estivesse utilizando uma construção XML).
DECLARE
@codLoja INTSET
@codLoja = 4340IF
@codLoja IN (SELECT codLoja FROM Tabela)BEGIN
PRINT
'Passou aqui'END
Será que isso já ajudaria ?
[ ]s,
Gustavo
-
Gustavo,
o que estou precisando fazer é pegar um parametro da minha aplicação, ou seja, se este parametro for igual a "TODOS" então irei buscar todos os registros. Sendo que este parametro que eu passo é um uniqueidentifier.
Como faço para implementar a minha StoreProcedure caso o parametro seja igual a "TODOS"?
-
Boa tarde dralvez,
Deixa eu ver se entendi. Caso vc escolha um parãmetro como o todos deve ser listado todos os registros que estão no banco. Porém se vc escolher um parâmetro tal só pode vir esse parâmetro correto? se for isso vc pode postar a parte da procedure que é responsável por esse filtro?!? Assim acredito que possa te ajudar com mais facilidade.
Abraço,
chapolin.rio@gmail.com
-
É isso mesmo, mas o mesmo parametro que informo que são todas lojas é também onde especifico uma unica loja.
Segue a procedure
--Create Procedure SP_Relatorio_ChequePresente_Por_Periodo
declare
@CodLoja uniqueidentifier,
@DtEnvioInicio smalldatetime,
@DtEnvioFim smalldatetime,
@StatusImpresso char(1),
@StatusDistribuido char(1),
@StatusUsado char(1),
@Valor money--AS
select @CodLoja = '00000000-0000-0000-0000-000000000001'
select @DtEnvioInicio = '20071211'
select @DtEnvioFim = '20071211'
select @StatusImpresso = 1
select @StatusDistribuido = 1
select @StatusUsado = 0
select @Valor = 0-- Pega o valor do codigo e se for '00000000-0000-0000-0000-000000000000' coloca codloja igual a null
IF @CodLoja = '00000000-0000-0000-0000-000000000000'
Select @CodLoja = Null-- Pega o valor do codigo e se for '00000000-0000-0000-0000-000000000001' lista todos os códigos das lojas
IF @CodLoja = '00000000-0000-0000-0000-000000000001'
Select @CodLoja = (Select CodLoja from Loja)-- Pega o valor do Valor e se for null coloca 0
IF @Valor is null
Select @Valor = 0
Select L.NomLoja, count(ChPr.NumBarras) as Qtde
from ChequePresente ChPr
inner join Loja L
on ChPr.CodLoja = L.CodLoja
where ChPr.CodLoja = @CodLoja
and dtenvio between @DtEnvioInicio and @DtEnvioFim
and ChPr.StatusImpresso = @StatusImpresso
and ChPr.StatusDistribuido = @StatusDistribuido
and ChPr.StatusUsado = @StatusUsado
and ChPr.Valor = @Valor
group by L.NomLoja -
-
drarlvez,
tenta dessa forma. O que eu comentei é pq não será mais usado. O parâmetro da procedure que corresponde a loja será opcional. Se for um todos basta passar o parâmetro como um NULL ou nem mesmo passar. Se for por uma loja só passar o parâmetro. A procedure vai tratar isso no where. Se for nulo vai igualar todos os campos e trará todos os resultado do banco.
Espero ter ajudado,
Abraço,
chapolin.rio@gmail.com
Create
Procedure SP_Relatorio_ChequePresente_Por_Periodo@CodLoja
uniqueidentifier = NULL,@DtEnvioInicio
smalldatetime,@DtEnvioFim
smalldatetime,@StatusImpresso
char(1),@StatusDistribuido
char(1),@StatusUsado
char(1),@Valor
money--AS
--select @CodLoja = '00000000-0000-0000-0000-000000000001'
select
@DtEnvioInicio = '20071211'select
@DtEnvioFim = '20071211'select
@StatusImpresso = 1select
@StatusDistribuido = 1select
@StatusUsado = 0select
@Valor = 0-- Pega o valor do codigo e se for '00000000-0000-0000-0000-000000000000' coloca codloja igual a null
-- IF @CodLoja = '00000000-0000-0000-0000-000000000000'
-- Select @CodLoja = Null
-- Pega o valor do codigo e se for '00000000-0000-0000-0000-000000000001' lista todos os códigos das lojas
-- IF @CodLoja = '00000000-0000-0000-0000-000000000001'
-- Select @CodLoja = (Select CodLoja from Loja)
-- Pega o valor do Valor e se for null coloca 0
IF @Valor is null Select @Valor = 0Select
L.NomLoja, count(ChPr.NumBarras) as Qtde from ChequePresente ChPr inner join Loja L on ChPr.CodLoja = L.CodLoja where ISNULL(ChPr.CodLoja, 0) = ISNULL(@CodLoja, ISNULL(ChPr.CodLoja, 0)) and dtenvio between @DtEnvioInicio and @DtEnvioFim and ChPr.StatusImpresso = @StatusImpresso and ChPr.StatusDistribuido = @StatusDistribuido and ChPr.StatusUsado = @StatusUsado and ChPr.Valor = @Valorgroup
by L.NomLoja -
Chapolin,
segue os erro que estão medando. Mas pelo que entendi não vou procurar fazer desta forma, pois eu marco a variavel @CodLoja como null para tratar outros casos.
Server: Msg 139, Level 15, State 1, Line 2
Cannot assign a default value to a local variable.
Server: Msg 137, Level 15, State 1, Line 22
Must declare the variable '@DtEnvioInicio'.
Server: Msg 137, Level 15, State 1, Line 24
Must declare the variable '@DtEnvioFim'.
Server: Msg 137, Level 15, State 1, Line 26
Must declare the variable '@StatusImpresso'.
Server: Msg 137, Level 15, State 1, Line 28
Must declare the variable '@StatusDistribuido'.
Server: Msg 137, Level 15, State 1, Line 30
Must declare the variable '@StatusUsado'.
Server: Msg 137, Level 15, State 1, Line 48
Must declare the variable '@Valor'.
Server: Msg 137, Level 15, State 1, Line 48
Must declare the variable '@Valor'.
Server: Msg 137, Level 15, State 1, Line 54
Must declare the variable '@Valor'.
Server: Msg 137, Level 15, State 1, Line 62
Must declare the variable '@CodLoja'. -
Esses erros estão dando por que modifiquei a sua proc. Vc me mandou com um script e eu a voltei como um proc. Só recolocar o declare na primeira variável e comentar o create proc. Na hora que fizer isso vc terá que tirar o = NULL no código da loja..
Agora esse lance da loja NULa para outros casos não entendi muito bem...
-
Eu fiz exatamente isso e o erro é este
Server: Msg 206, Level 16, State 2, Line 39
Operand type clash: int is incompatible with uniqueidentifier
Server: Msg 206, Level 16, State 1, Line 39
Operand type clash: int is incompatible with uniqueidentifierCom relação ao null eu tenho que trabalhar o mesmo porque quando estiver null eu buscarei todos aqueles registros que não estão em loja alguma.
-
-
Essa condição aí quer dizer o seguinte.
Se o campo ChPr.CodLoja for nulo ele ser tornará um 0
Se a variável @CodLoja for nula ela se tornará um 0 .
Sendo assim 0 = 0. Where retorna todo mundo.
Se o campo ChPr.CodLoja <> nulo o campo continuára com seu valor
Se a variável @CodLoja <> nula ela se tornará o mesmo valor que o campo ChPr.CodLoja. Sendo assim vai retornar todo mundo pois os campos serão iguais.
Se o campo ChPr.CodLoja <> nulo o campo continuára com seu valor
Se a variável @CodLoja <> nula ela continuára com seu valor
Sendo assim só retornará os campos que forem ChPr.CodLoja = @CodLoja .
Consegui explicar direito?!?
Qualquer parada posta que tento explicar de outra forma.
Abraço,
chapolin.rio@gmail.com
-
-
-
-
-
-
Bem Daniel,
A respeito da galera nula vc pode pensar de uma seguinte forma. Quando a variável da loja for para trazer nula vc transforma ela num valor e o campo tambem. Usar o camp do where para isso. O que vc pode fazer como sua proc é pequena fazer um IF. Quero buscar todas as lojas Nulas ae vc vai pra condição das lojas nulas com o where dessa forma por exemplo.
QUERO BUSCAR LOJAS NULAS
RECEBI A VARIÁVEL DESSA FORMA
@CodLoja = 'XXX'
IF @CodLoja = 'XXX'
Select
and dtenvio between @DtEnvioInicio and @DtEnvioFim
and ChPr.StatusImpresso = @StatusImpresso
and ChPr.StatusDistribuido = @StatusDistribuido
and ChPr.StatusUsado = @StatusUsado
and ChPr.Valor = @Valor
group
by L.NomLojaELSE
Select
group
by L.NomLojaVai ficar um poquinho grande mas resolve seu problema sem mais um condição e risco de queda de performance...
Isso aí eu pensei rápido aqui.. Se pintar outra idéia eu te digo... Quando a explicação peraí que vou postar aqui uma no capricho..
rsrsrsrsrs
-
Daniel,
Vamos lá.
Todos nós sabemos que uma consula só é realizada, na maioria dos casos, quando as condições impostas para essa
consulta se aplicam. Não adianta eu procurar laranjas num pé de manga. MAs com certeza eu encontrarei limões num pé de Limão.
Pois bem, sendo assim uma condição para um busca é tão importante como o que quero buscar.
Sendo assim voltanso ao exemplo abstrato, eu sou dono de um pomar, esse pomar tem vários tipos de frutas.
Todos os dias eu tenho que ir para buscar as frutas. Só que eu tenho uma regra para buscar as frutas. Na segunda eu
só posso pegar as maças, as terças as laranjas, as quartas os pêssegosm as quintas, os limões, as sextas os morangos aos sábados
as amores e domingo eu ´PRECISO pegar todas as futas. Eu malandramente, construí uma máquina para buscar as frutas pra mim, só que
para ela saber quais as frutas para buscar eu preciso carregar a máquina com a fruta certa para o dia certo. Sendo assim o que ficaria
mais fácil?? Eu criar 7 rotinas para cada dia da semana ou uma única rotina que possa ser usada nos 7 dias da semana?? INCLUSIVE
NO DIA QUE TEM QUE TRAZER TODAS AS FRUTAS!!!!
Sendo assim eu resolvi fazer uma única rotina.
vou lá entro com o seguinte dado na segundaSELECIONE TODAS AS FRUTAS
QUE O NOME SEJA (AQUI EU VOU COLOCAR A FRUTA)BLZ..... JÁ RESOLVI MEU PROBLEMA!!!!!!!!!!!! UPA!!!!!!!!
OP'S É DOMINGO?? COMO VOU COLOCAR TODAS AS FRUTAS NESSA IGUALDADE SABENDO QUE SÓ PODE SER IGUAL A UMA FRUTA??
Posso colocar uma porção de ou... Ou essa ou aquela ou aquela outra. PO mas se eu quiser cultivar mais frutas vou ter que ficar
mechendo sempre nessa rotina?? e vai ficar feio e grande!!! Po fala sério.. então o que fazer??Malandramente, estou dando ênfase ao malandramente pq sou eu quem está explicando né?!?! Me dar uma moral!! srrsrsrs,
eu pensei o seguinte. Quer saber.. Quando eu não passar nennhuma fruta eu vou querer que ele pegue todas.
sendo assim só preciso igualar a fruta que está cadastrada a fruta que eu quero.
Sendo assim eu cheguei ao seguinte algorítmo.
ISNULL(fruta CADASTRADA, 0) = ISNULL(FRUTA QUE QUERO, ISNULL(fruta CADASTRADA, 0))SENDO ASSIM COMO MINHA FRUTA ESTÁ VAZIA ESSA FRUTA VAI SE TRANSAFORMAR NA FRUTA QUE ESTOU SELECINANDO NO MOMENTO.
OU SEJA..PRIMEIRO ELA SE TRASNFORMA NO SEGUINTE:
MAÇÃ = MAÇÃ (RETORNA)
LARANJA = LARANJA (RETORNA)
UVA = UVA (RETORNA)
.
.
.MARAVILHA PROBLEMA RESOLVIDO.... QUANDO EU PRECISAR DE UMA FRUTA TAL EU ENTRO COM ELA.. SENDO ASSIM FICARÁ DESSA FORMA
MAÇÃ = MAÇÃ (RETORNA)
LARANJA <> MAÇÃ (NÃO RETORNA)
UVA <> MAÇÃ (NÃO RETORNA)
.
.
.PROBLEMA RESOLVIDO SEM GASTAR CÓDIGO E MEU TEMPO. FUTURAMENTE SE EU QUISER OUTRA FRUTA SÓ CADASTRA-LA NO SISTEMA E RIR A TOA..
JÁ POSSO IR A PRAIA E TOMAR MINHA CERVEJADANIEL,
BRINCADEIRAS A PARTE, não se ofenda com a analogia. Só achei que dessa forma seria melhor par entendimento.
Qualquer parada não se acanhe e volte a perguntar..Abraçoi,
-
-
-
-
-
-
dralves wrote: É isso mesmo, mas o mesmo parametro que informo que são todas lojas é também onde especifico uma unica loja.
Segue a procedure
--Create Procedure SP_Relatorio_ChequePresente_Por_Periodo
declare
@CodLoja uniqueidentifier,
@DtEnvioInicio smalldatetime,
@DtEnvioFim smalldatetime,
@StatusImpresso char(1),
@StatusDistribuido char(1),
@StatusUsado char(1),
@Valor money--AS
select @CodLoja = '00000000-0000-0000-0000-000000000001'
select @DtEnvioInicio = '20071211'
select @DtEnvioFim = '20071211'
select @StatusImpresso = 1
select @StatusDistribuido = 1
select @StatusUsado = 0
select @Valor = 0-- Pega o valor do codigo e se for '00000000-0000-0000-0000-000000000000' coloca codloja igual a null
IF @CodLoja = '00000000-0000-0000-0000-000000000000'
Select @CodLoja = Null-- Pega o valor do codigo e se for '00000000-0000-0000-0000-000000000001' lista todos os códigos das lojas
Code BlockO problema na sua procedure está aqui, quando você fala pra buscar o código da loja na tabela Loja a query está retornando mais de um valor.
IF @CodLoja = '00000000-0000-0000-0000-000000000001'
Select @CodLoja = (Select CodLoja from Loja)-- Pega o valor do Valor e se for null coloca 0
IF @Valor is null
Select @Valor = 0
Select L.NomLoja, count(ChPr.NumBarras) as Qtde
from ChequePresente ChPr
inner join Loja L
on ChPr.CodLoja = L.CodLoja
where ChPr.CodLoja = @CodLoja
and dtenvio between @DtEnvioInicio and @DtEnvioFim
and ChPr.StatusImpresso = @StatusImpresso
and ChPr.StatusDistribuido = @StatusDistribuido
and ChPr.StatusUsado = @StatusUsado
and ChPr.Valor = @Valor
group by L.NomLoja