Array
(
)

problema com stored procedure

Ezdala
   - 25 mai 2005

ola ... tudo bem ??

estou com um problema em uma stored procedure q é o seguinte:
em minha aplicação existe algumas tabelas q naum tem chave automática (autoincrent) para essas tabelas existe uma tabela de ´indice´ q tem para cada tabela um campo ex: IND_CLIENTE (tab. cliente), IND_PRODUTO (tab. produto), etc... bem criei uma stored procedure q gerará o codigo para mim com o seguinte esquema:
CREATE PROCEDURE cp_GeraIndice(@campo varchar(50)) AS
set nocount on
EXEC(´update INDICE set IND_´ + @campo + ´ = (select (IND_´ + @campo + ´ + 1) from INDICE)´)
return(select IND_CLIENTE (aqui no caso teria q entrar a variavel campo para saber qual tabela se refere) from INDICE)
set nocount off
GO

meu problema esta na hora de capturar o retorno do codigo gerado ... pois o parametro @campo vem o nome da tabela q é para ser gerado o indice ... isso esta funcionando ... mas como pegar o retorno ?

Grato

Enderson

Marcus.magalhaes
   - 25 mai 2005

Boa tarde.

vc deve usar um parametro de output.

Ex.: Create Procedure TESTE (@campo_entrada VarChar(10), @retorno Int OUTPUT)
As
Begin
update tbl_name
set colunax = @campo_entrada
Where condicao

Select @retorno = colunax From tbl_name Where condição
End
GO

Dessa forma a variável @retorno terá o valor da colunax.

PS.: Gostaria de salientar que esta forma de fazer o ´autoincremento´ é extremamente prejudicial ao banco, pois gerará uma concorrencia de acesso desnecessária. Outro ponto importante é o risco de que sejam geradas chaves duplicadas.
Recomendo fortemente que seja usado o IDENTITY ao invés desta forma que vc está em dúvida.

Espero ter ajudado.
Att,

Ezdala
   - 25 mai 2005

obrigado pela resposta Marcos, eu concordo com vc q o uso do IDENTITY é sem sombra de dúvida a melhor forma de gerar valor para o campos chaves, so q o nesse caso, o banco recebe informações de um outro banco ´remoto´ sendo q nesse banco ´remoto´ são gerado e enviados os registros (clientes, pedidos etc...) para esse banco central onde tem um prg gerenciador q ficha checando a chegada desses arquivos (xml) de tempo em tempo ... a ´retirada´ do identity é pq foi decidido q as estruturas dos bancos tem q ser a mesma, e para preservar o mesmo codigo. Bem naum sei se vc entendeu ... mas tudo bem :)

Bem naum sei o q fiz de errado mas, eu naum consegui executar a stored procedure q vc colocou de exemplo gerou um erro na ´colunax´ mas na minha realidade ficaria assim:

create procedure ... as

update INDICE set coluna = @campo_entrada + 1 (não ha condição pq essa tabela so tem 1 registro)

select @retorno = colunax from indice (não ha condição pq essa tabela so tem 1 registro)

grato
Enderson