Procedure dinamica
11/12/2014
0
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
Post mais votado
12/12/2014
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 + ''''
Soeuseijothaz
Mais Posts
11/12/2014
Soeuseijothaz
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.
11/12/2014
Patricia
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
11/12/2014
Soeuseijothaz
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.
12/12/2014
Patricia
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?
12/12/2014
Soeuseijothaz
De nada!
Uma dica é usar:
print @comando
Assim você consegue visualizar como a expressão esta sendo montada.
12/12/2014
Marisiana Battistella
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.
Clique aqui para fazer login e interagir na Comunidade :)