Olá!
Estou montando uma trigger e preciso do seguinte:
Quando um registro for atualizado na minha tabela preciso atualizar outra tabela baseado em um Select. Para isso eu precisaria rodar um "loop" com os resultados do banco, mas não sei se é possível. Vou exemplificar colocando em ASP o que eu
preciso traduzir para banco de dados, SQL Server nesse caso.
rs.Open("SELECT ID, ID2 FROM TABELA")
Do Until rs.EOF
objCN.Execute("UPDATE TABELA2 SET campo1 = campo1 + 1 WHERE codigo1 = " & rs("id") & " AND codigo2 = " & rs("id2"))
rs.MoveNext
Loop
Entenderam?
Abraços
Algo Parecido Com Rs.eof
Started By TucaZ, 11/01/2005, 10:18
5 replies to this topic
#1
Posted 11/01/2005, 10:18
#2
Posted 11/01/2005, 11:01
Cara... tem um tal de Books Online, quando vc instala o SQL SERVER, digamos que seja a Referencia da Linguagem, se vc procurar pelo comando WHILE, vai perceber como a coisa é bem mais simples do que imagina, exemplo:
... DECLARE @id1 INT DECLARE @id2 INT DECLARE ids_cursor CURSOR FOR SELECT ID1, ID2 FROM TABELA OPEN ids_cursor FETCH NEXT FROM ids_cursor INTO @id1, @id2 WHILE @@FETCH_STATUS = 0 BEGIN UPDATE TABELA2 SET campo1=(campo1+1) WHERE codigo1=@id1 AND codigo2=@id2 FETCH NEXT FROM ids_cursor INTO @id1, @id2 END CLOSE ids_cursor DEALLOCATE ids_cursor ...
------
Mero mortal!
Mero mortal!
#3
Posted 11/01/2005, 12:09
Valeu, Prog. Não uso o books online porque não tenho nada do SQL Server instalado aqui. Eu acesso ele somente pelo ASP.
Vou tentar com o código que você passou e ver o que consigo fazer.
Em todo caso, vou deixar aqui meu Trigger pra ver se vc pode me dar uma ajuda. Quando eu rodo essa Query ele me retorna erro "Near =". Acho que seja na linha 8 da query.
Vou tentar com o código que você passou e ver o que consigo fazer.
Em todo caso, vou deixar aqui meu Trigger pra ver se vc pode me dar uma ajuda. Quando eu rodo essa Query ele me retorna erro "Near =". Acho que seja na linha 8 da query.
CREATE TRIGGER pedidos_campanha ON pedido FOR UPDATE AS BEGIN DECLARE @CampanhaID INT, @CampanhaFrom varchar(30) IF EXISTS(SELECT P.datfim_ped FROM pedido P INNER JOIN updated U ON P.codped_ped = U.codped_ped WHERE NOT P.datfim_ped IS NULL) BEGIN WHILE EXISTS(SELECT @CampanhaID = PXP.intCampanhaID, @CampanhaFrom = PXP.chaPXPFrom FROM pedidoxproduto PXP INNER JOIN updated U ON PXP.codped_ped = U.codped_ped) BEGIN UPDATE campanhaassist SET intQtdPedido = intQtdPedido + 1 WHERE intCampanhaID = @CampanhaID AND chaAssistFrom = @CampanhaFrom END END END
Edição feita por: TucaZ, 11/01/2005, 12:19.
#4
Posted 11/01/2005, 12:36
Hmm...com o Cursor teoricamente funcionou. Só tenho um problema agora. A tabela Updated não existe. No caso de Trigger só INSERTED e DELETED existem. Como vou fazer pra poder saber QUAL registro foi atualzado? Estou procurando aqui no MSDN, mas não achei ainda.
Valeu!
Valeu!
#5
Posted 11/01/2005, 12:50
No cado de uma trigger do tipo UPDATE, existem ambos INSERTED e DELETED, neste caso, vc tem que avaliar qual serve melhor, acho que, neste caso, ambos funcionam, uma vez que vc não esta fazendo update na chave.
------
Mero mortal!
Mero mortal!
#6
Posted 11/01/2005, 13:46
Consegui! Valeu a ajuda, Prog!
CREATE TRIGGER pedidos_campanha ON pedido FOR UPDATE AS DECLARE @CampanhaID INT DECLARE @CampanhaFrom varchar(30) IF EXISTS(SELECT P.datfim_ped FROM pedido P INNER JOIN inserted U ON P.codped_ped = U.codped_ped WHERE NOT P.datfim_ped IS NULL) BEGIN DECLARE ids_cursor CURSOR FOR SELECT PXP.intCampanhaID, PXP.chaPXPFrom FROM pedidoxproduto PXP INNER JOIN inserted U ON PXP.codped_pxp = U.codped_ped OPEN ids_cursor FETCH NEXT FROM ids_cursor INTO @CampanhaID, @CampanhaFrom WHILE @@FETCH_STATUS = 0 BEGIN UPDATE campanhaassist SET intQtdPedido = intQtdPedido + 1 WHERE intCampanhaID = @CampanhaID AND chaAssistFrom = @CampanhaFrom INSERT INTO tuca (texto) VALUES (CAST(@CampanhaID AS VARCHAR(100))) FETCH NEXT FROM ids_cursor INTO @CampanhaID, @CampanhaFrom END CLOSE ids_cursor DEALLOCATE ids_cursor END
1 user(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)