Procedure dinamica

11/12/2014

Oi gente.
Só entendo um pouco de sql, por isso minha pergunta pode parecer boba.

Fiz um programa onde para cada query eu criei uma procedure. Só que, ficaram muitas procedures e eu queria unificar isso, por exemplo, tudo o que for select eu deixo em uma mesma procedure, tudo o que for insert fica em outra.

Só que, eu preciso declarar minhas variáveis, pois cada consulta é um select diferente (com parâmetros diferentes), eu queria saber como faço isso, pois se eu criar tudo no começo, qd eu chamar a procedure eu terei que passar todas as informações.

Estou fazendo com o if, se a consulta for igual a 1 ele faz tal select, se for 2 faz outro. Tem como declarar uma variavel para cada bloco?

Patricia

Melhor resposta

12/12/2014

Seu Where esta assim:
 Where b.Tipo = hd


E deve ficar assim:
Where b.Tipo= 'hd'


Para isso faça o seguinte ajuste:
Set @Comando = 'Select a.Id_Conta,
b.Tipo,
a.Prestadora,
a.End_SRV_SQL,
a.End_IP,
a.Porta,
a.Terminal_Server,
a.Link,
a.Qtd_Tipo_Servicos,
a.NM_Servidor from Tb_Endereco a inner join Tb_Tipo_Acesso b on b.Id_Acesso = a.Tipo 
Where '+ @ChaveTabela + ' = '''+ @ChaveValor + ''''

Jothaz

Responder Citar

Outras Respostas

11/12/2014

Jothaz

Patricia,

O que lhe incomoda em ter várias stored procedures?

Não acho recomendável nem um boa prática unir as funcionalidades em um única sp, vai contra as melhores práticas.
Além do problema de ter de passar variáveis, vai ficar muito difícil entender o código e dar manutenção.

Você pode passar null para parâmetro da SP veja:

[url:descricao=http://technet.microsoft.com/pt-br/library/ms189330(v=sql.105).aspx]http://technet.microsoft.com/pt-br/library/ms189330(v=sql.105).aspx[/url]

http://forum.imasters.com.br/topic/358114-resolvidoprocedure-com-parametros-null/

Ma acredito que os transtornos que terá e o caos no entendimento do código não valerá a pena.

Uma das vantagens da SP é justamente: atomicidade e separação das funcionalidades.

Agora isso é somente minha opinião pessoal baseada em minha vivência, talvez outros integrantes do fórum tenha outra visão e possa lhe sugerir como contornar o problema.
Responder Citar

11/12/2014

Patricia

Oi Jothaz

Foi meu chefe quem comentou para tentar minimizar a quantidade, tentando utilizar algum case, vou dar uma olhada nos links que vc me passou.

Obrigada
Responder Citar

11/12/2014

Jothaz

Oi Jothaz Foi meu chefe quem comentou para tentar minimizar a quantidade, tentando utilizar algum case, vou dar uma olhada nos links que vc me passou. Obrigada


De nada!

A questão esta sendo abordada de forma equivocada.
Se vais usar SP cada uma é referente a uma funcionalidade.
Desta forma que estais propondo pode afetar a performance. Sem falar na legibilidade do código.
Acredito que poderá ocorrer problemas de concorrência (lock) de registros por estar usando a mesma sp, mas sinceramente não tenho certeza.
Então pondere muito antes de efetuar esta alteração.
E vamos aguardar outras manifestações do pessoal aqui.
Responder Citar

12/12/2014

Patricia

Boa tarde gente.

Tentei implementar uma procedure, mas não está funcionando, ela está da seguinte forma:

CREATE Procedure SP_S_EndTpAcesso
@ChaveTabela varchar(50),
@ChaveValor VarChar(50) 

As

Begin

Declare @Comando Varchar(1000)

Set @Comando = 'Select a.Id_Conta,
b.Tipo,
a.Prestadora,
a.End_SRV_SQL,
a.End_IP,
a.Porta,
a.Terminal_Server,
a.Link,
a.Qtd_Tipo_Servicos,
a.NM_Servidor from Tb_Endereco a inner join Tb_Tipo_Acesso b on b.Id_Acesso = a.Tipo 
Where '+@ChaveTabela + ' = '+ @ChaveValor

Exec(@Comando)

End


Quando eu chamo a procedure, eu chamo da seguinte forma:

exec SP_S_EndTpAcesso 'b.Tipo', 'hd'


Onde b.Tipo é o nome da coluna e HD é o conteúdo da coluna.

Mas me vem a resposta 'Invalid column name 'hd'.'

Alguém pode me explicar o que estou fazendo de errado?
Responder Citar

12/12/2014

Patricia

Funcionou. Obrigada.
Responder Citar

12/12/2014

Jothaz

Funcionou. Obrigada.


De nada!

Uma dica é usar:

print @comando 


Assim você consegue visualizar como a expressão esta sendo montada.
Responder Citar

12/12/2014

Marisiana

Olá! Peguei o bonde andando aqui... Concordo com a opinião do Jothaz..!
Você pode separar as procedures que realizam insert das que realizam select utilizando Packages, assim, vai ficar bem mais prático de trabalhar.
Sobre criar uma única procedure para todos os selects, também não recomendo, o ideal seria criar uma procedure para cada situação.
Responder Citar