Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 504183
            [titulo] => Procedure dinamica
            [dataCadastro] => DateTime Object
                (
                    [date] => 2014-12-12 12:22:35
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 238223
            [status] => A
            [isExample] => 
            [NomeUsuario] => soeuseijothaz
            [Apelido] => jothaz
            [Foto] => 238223_20141108222927.jpg
            [Conteudo] => Seu Where esta assim:
[code]
Where b.Tipo = hd
[/code]

E deve ficar assim:
[code]
Where b.Tipo= 'hd'
[/code]

Para isso faça o seguinte ajuste:
[code]
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 + ''''
[/code] ) )

Procedure dinamica

Patricia
   - 11 dez 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?

Post mais votado

Jothaz
   - 12 dez 2014

Seu Where esta assim:
#Código

 Where b.Tipo = hd


E deve ficar assim:
#Código
Where b.Tipo= 'hd'


Para isso faça o seguinte ajuste:
#Código
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
   - 11 dez 2014

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:

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

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.

Patricia
   - 11 dez 2014

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

Jothaz
   - 11 dez 2014


Citação:
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.

Patricia
   - 12 dez 2014

Boa tarde gente.

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

#Código

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:

#Código
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?

Patricia
   - 12 dez 2014

Funcionou. Obrigada.

Jothaz
   - 12 dez 2014


Citação:
Funcionou. Obrigada.


De nada!

Uma dica é usar:

#Código

print @comando 


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

Marisiana
   - 12 dez 2014

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.