Usuário com melhor resposta
Duvidas sobre Cursores(Como montar e utilizar)

Pergunta
-
Olá colegas,
Tenho de fazer uma Trigger que vai executar varios Updates dependo de varios valores dentro de uma consulta, andei pesquisando e encontrei um objeto chamdo de CURSOR.
Se eu entendi ele me parece um DataTable ou RecorSet (lá .NET e VB), então como utilizar os valores contidos dentro dele?
Estou precisando de um modelo mais ou menos assim:CREATE TRIGGER TRG_TESTE ON TAB_TESTE FOR INSERT DECLARE tmp_cursor CURSOR FOR SELECT * FROM TAB_TESTE2 OPEN tmp_cursor FETCH NEXT FROM tmp_cursor WHILE @@FETCH_STATUS = 0 BEGIN UPDATE TAB_TESTE3 --(Valor do campo de um cursor) Como pegar um valor de um campo na linha de umCURSOR ? SET [CAMPO1] = @VAL1 WHERE [CMPx] = @CMP2 FETCH NEXT FROM temp_cursor END CLOSE TEMP GO
Outras perguntas:
O que falta nesse modelo?
Estou fazendo algo errado?
E como posso consiguir os valores da linha de um cursor?
Se esse objeto vai receber um Select, mudar algo nele vai refletir na origem do Select ? (é como se ele fosse um dataTable em memoria ?)
Existe algum objeto mais rapido só de leitura? Que nem o DataReader ?
Obrigado pela atenção galera!
e desculpa pelas varias perguntas em topico só.
Abraão Alves - Um eterno estudante
Respostas
-
Boa tarde Abraão
Sem dúvida os cursores facilitam e muito a vida, contudo, você pode ter alguns problemas de desempenho bem como de locks uma dica é você utilizar o hint FORWARD_ONLY, com ele a declaração ficaria assim :
DECLARE tmp_cursor CURSOR FORWARD_ONLY
Para você pegar os valores basta você declarar variáveis e no FETCH atribuir para as variaveis os campos
Declare @codigo int
Declare @nome varchar(100)
Declare tmp_cursor Forward_Only For Select codigo,nome from suatabela
Open tmp_cursor
FETCH NEXT FROM tmp_cursor
INTO @codigo,@nome
Espero ter ajudado
Anderson - DBA/MCP/MCTS/MCITP/MCT - Sua pergunta foi respondida ? Marque-a como tal! www.myspace.com/andersondpa- Marcado como Resposta Abraão Alves sexta-feira, 30 de outubro de 2009 16:32
Todas as Respostas
-
Abraão,
Cara não rcomendo uso de cursores, ele vai fazer com que sua performance seja ruim.
no seu script existe uma maneira mais simples e rápida para fazer o update
UPDATE a SET a.campo1 = b.VAL1 FROM TAB_TESTE3 a inner join TAB_TESTE2 b ON a.CMPx] = b.CMP2
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
Boa tarde Abraão
Sem dúvida os cursores facilitam e muito a vida, contudo, você pode ter alguns problemas de desempenho bem como de locks uma dica é você utilizar o hint FORWARD_ONLY, com ele a declaração ficaria assim :
DECLARE tmp_cursor CURSOR FORWARD_ONLY
Para você pegar os valores basta você declarar variáveis e no FETCH atribuir para as variaveis os campos
Declare @codigo int
Declare @nome varchar(100)
Declare tmp_cursor Forward_Only For Select codigo,nome from suatabela
Open tmp_cursor
FETCH NEXT FROM tmp_cursor
INTO @codigo,@nome
Espero ter ajudado
Anderson - DBA/MCP/MCTS/MCITP/MCT - Sua pergunta foi respondida ? Marque-a como tal! www.myspace.com/andersondpa- Marcado como Resposta Abraão Alves sexta-feira, 30 de outubro de 2009 16:32