none
dúvida básica de iniciante => t-sql percorrer os registros de um select dentro de uma trigger RRS feed

  • Pergunta

  • Senhores, boa noite!

    Como faço um loop para percorrer os registros ?

    Minha lógica, incluída dentro de uma trigger ou procedure:

    declare @a1 as integer
    declare @b1 as integer
    declare @c1 as integer
     select @a1 = a, @b1 = b, @c1 = c from tabela 
    imaginava usar um while






    quinta-feira, 11 de junho de 2020 22:39

Todas as Respostas

  • Bom dia,

    Para percorrer as linhas de uma tabela no SQL Server deve ser utilizado um Cursor:

    https://docs.microsoft.com/pt-br/sql/t-sql/language-elements/declare-cursor-transact-sql?view=sql-server-ver15

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 12 de junho de 2020 12:21
  • Com certeza ajudou muito, norteou para onde tenho que ir!

    Obrigado

    sexta-feira, 12 de junho de 2020 16:05
  • danews

    nao use cursor!!!!!

    o que vc precisa fazer nos registros?

    sábado, 13 de junho de 2020 12:57
  • Neste caso a consulta retorna uma relação de IP que tiveram uma quantidade excessiva de acessos em um curto espaço de tempo, e insere eles em uma tabela bloqueio até uma determinada data hora.

    A consulta agrupa os ip mais pode ocorrer de retornar mais de 1 registro.

    Teria alguma outra solução ?

    domingo, 14 de junho de 2020 13:04
  • quanto tempo? quantos acessos?

    select t1.ip,t1.horario_acesso,count(*) qtd
    from tabela t1,tabela t2
    where t2.ip=t1.ip and t2.horario_acesso>t1.horario_acesso and t2.horario_acesso<dateadd(mm,t1.horario_acesso,@tempo)
    group by t1.ip,t1.horario_acesso
    having count(*)>=@acessos


    • Editado Avatar SQL segunda-feira, 15 de junho de 2020 11:36
    segunda-feira, 15 de junho de 2020 11:30
  • Sim, mais pode retornar várias linhas, desejo percorrer elas para dai fazer o insert na tabela bloqueio. 

    Na logica do cliente antes de cada insert tem que fazer um outro select para ver se ja não esta bloqueado o ip. Se inserir direto da erro duplicado de chave pk, poderia alterar a tabela para inserir uma chave de auto incremento mais não posso alterar o banco do cliente então sou obrigado a checar antes do insert.

    Acabei usando os cursores e deu certo!

    Obrigado pela atenção, também ajudou!


    segunda-feira, 15 de junho de 2020 20:04
  • DANEWS,

    Sinceramente falando eu prefiro utilizar o While do que Cursor!!! Identificar problemas e possíveis soluções em um bloco While é muito mais fácil do que em um cursor.

    Estas linhas que você deseja percorrer, elas não poderia ser repassadas para outra tabela? Já pensou em trabalhar com tabelas auxiliares ou até mesmo temporárias?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 15 de junho de 2020 22:56
    Moderador
  • insert ipbloqueado (ip, bloqueadoate)
    select distinct t1.ip,xxx from tabela t1,tabela t2
    where t2.ip=t1.ip and t2.horario_acesso>t1.horario_acesso and t2.horario_acesso<dateadd(mm,t1.horario_acesso,@tempo)
    and not exists(select 1 from ipbloqueado t3 where t3.ip=t1.ip)
    group by t1.ip,t1.horario_acesso
    having count(*)>=@acessos

    xxx eh ateh qual horario ip deve ficar bloqueado. @tempo eh em minutos. cursor eh coisa do diabo. nao use.

    • Editado Avatar SQL terça-feira, 16 de junho de 2020 10:38
    terça-feira, 16 de junho de 2020 10:22
  • DANEWS,

    Sinceramente falando eu prefiro utilizar o While do que Cursor!!! Identificar problemas e possíveis soluções em um bloco While é muito mais fácil do que em um cursor.

    Estas linhas que você deseja percorrer, elas não poderia ser repassadas para outra tabela? Já pensou em trabalhar com tabelas auxiliares ou até mesmo temporárias?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    cursor tambem usa while...
    terça-feira, 16 de junho de 2020 10:23
  • DANEWS,

    Sinceramente falando eu prefiro utilizar o While do que Cursor!!! Identificar problemas e possíveis soluções em um bloco While é muito mais fácil do que em um cursor.

    Estas linhas que você deseja percorrer, elas não poderia ser repassadas para outra tabela? Já pensou em trabalhar com tabelas auxiliares ou até mesmo temporárias?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    cursor tambem usa while...
    Sim, caro colega, mas eu me refiro a usar o While sozinho e não dentro de um cursor!!!!

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 16 de junho de 2020 22:41
    Moderador
  • while le linha por linha. com ou sem cursor. eh algo sempre lento nao importa qual. 

    Eh mais facil identificar problemas e possiveis solucoes em um bloco while com cursor.


    • Editado Avatar SQL quarta-feira, 17 de junho de 2020 17:52
    quarta-feira, 17 de junho de 2020 16:26
  • while le linha por linha. com ou sem cursor. eh algo sempre lento nao importa qual. 

    Eh mais facil identificar problemas e possiveis solucoes em um bloco while com cursor.


    Caro colega,

    Discordo desta sua afirmação: "Eh mais facil identificar problemas e possiveis solucoes em um bloco while com cursor"




    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 17 de junho de 2020 21:01
    Moderador
  • Senhores,

    Da para percorrer os registros com o while sem usar cursor?

    Att.

    Daniel

    sábado, 20 de junho de 2020 12:28
  • Daniel,

    Sim, com certeza, basta declara o comando While estabelecendo as condições para persistência de execução e encerramento do loop.

    Veja o exemplo abaixo:

    Create Table novousuario (Codigo int identity(1,1) Primary Key, Descricao varchar(10), Data datetime, Senha char(10)) Go Insert Into NovoUsuario values('Pedro', Getdate(),'') Insert Into NovoUsuario values('Edu', Getdate()-300,'') Insert Into NovoUsuario values('João',Getdate()-200,'') Insert Into NovoUsuario values('Malú', Getdate()-100,'') Insert Into NovoUsuario values('Fer', Getdate()-10,'') Go Select * from NovoUsuario Go Declare @Codigo TinyInt, @TotalDeLinhas TinyInt Set @Codigo=1

    Set @TotalDeLinhas = (Select Count(Codigo) From NovoUsuario) While @Codigo <= @TotalDeLinhas Begin Update NovoUsuario Set Senha=Convert(Char(10), Data, 103) Where Codigo = @Codigo Set @Codigo=@Codigo + 1 End Go Select * From NovoUsuario Go

    Ressalto que este é somente um exemplo, não existe nenhuma regra de negócio ou análise de técnicas ou procedimentos para identificar que esta possa ser a melhor solução.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]




    domingo, 21 de junho de 2020 16:06
    Moderador

  • Caro colega,

    Discordo desta sua afirmação: "Eh mais facil identificar problemas e possiveis solucoes em um bloco while com cursor"



    toda unanimidade eh burra. se vc discorda entao estou certo. mas quem entende de cursor sabe como identificar problemas e possiveis solucoes rapidamente...
    segunda-feira, 22 de junho de 2020 12:30

  • Caro colega,

    Discordo desta sua afirmação: "Eh mais facil identificar problemas e possiveis solucoes em um bloco while com cursor"



    toda unanimidade eh burra. se vc discorda entao estou certo. mas quem entende de cursor sabe como identificar problemas e possiveis solucoes rapidamente...

    Certo, por isso que cada um de nós tem uma forma diferente de pensar....

    Respeito a sua afirmação e tenho a certeza que você respeita a minha, agora dizer que você esta certo, é a sua opinião e não a minha.

    No que se refere a ser burro ou não, nobre colega, mais cuidado com as suas palavras.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 22 de junho de 2020 12:36
    Moderador
  • "toda unanimidade eh burra" eh uma frase conhecidissima dita por nelson rodrigues... nao tem nela qq referencia a alguemser burro.
    • Editado Avatar SQL segunda-feira, 22 de junho de 2020 12:41
    segunda-feira, 22 de junho de 2020 12:39
  • "toda unanimidade eh burra" eh uma frase conhecidissima dita por nelson rodrigues... nao tem nela qq referencia a alguemser burro.
    Eu sei nobre colega, eu sei disso.... Conheço a frase, mas não vejo o porque utilizar aqui.... de forma alguma eu estou dizendo que você esta errado ou certo, somente apresentei o meu ponto de vista.

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 22 de junho de 2020 12:43
    Moderador
  • fazer count(*) toda hora?  muito ineficiente... isto funciona: update novousuario set senha=convert(char(10),data,103)
    segunda-feira, 22 de junho de 2020 12:47
  • fazer count(*) toda hora?  muito ineficiente... isto funciona: update novousuario set senha=convert(char(10),data,103)

    Avatar,

    É somente um exemplo, sim funciona sim o Update que eu fiz, é somente um exemplo.

    Mas vou alterar o Count(), concordo com a sua observação, não ficou legal o uso do Count() desta forma.

    Obrigado.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    segunda-feira, 22 de junho de 2020 13:49
    Moderador

  • Avatar,

    É somente um exemplo, sim funciona sim o Update que eu fiz, é somente um exemplo.

    Mas vou alterar o Count(), concordo com a sua observação, não ficou legal o uso do Count() desta forma.

    Obrigado.


    o select depois do begin tambem eh inutil.
    segunda-feira, 22 de junho de 2020 15:21

  • Avatar,

    É somente um exemplo, sim funciona sim o Update que eu fiz, é somente um exemplo.

    Mas vou alterar o Count(), concordo com a sua observação, não ficou legal o uso do Count() desta forma.

    Obrigado.


    o select depois do begin tambem eh inutil.

    ------------------------------------------------

    Avatar,

    Pode até ser para este exemplo, caro colega, é somente um exemplo, eu já destaquei isso, temos que apresentar as possibilidades e fazer com que o autor da dúvida também aprenda, ninguém tem a obrigação de responder de forma 100% correta, o objetivo dos fóruns também é fazer com que as pessoas pensem....

    Mas alterei para atender a sua observação.



    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 22 de junho de 2020 17:53
    Moderador
  • Avatar,

    Pode até ser para este exemplo, caro colega, é somente um exemplo, eu já destaquei isso, temos que apresentar as possibilidades e fazer com que o autor da dúvida também aprenda, ninguém tem a obrigação de responder de forma 100% correta, o objetivo dos fóruns também é fazer com que as pessoas pensem....

    Mas alterei para atender a sua observação.


    isso mesmo cada um sugere conforme o q sabe. de qq forma seu script eh lento pois para cada codigo q processar tera q ler toda a tabela no update. se a tabela tiver milhao de linhas cada linha sera lida milhao x milhao de vezes.

    terça-feira, 23 de junho de 2020 12:02
  • Avatar,

    Pode até ser para este exemplo, caro colega, é somente um exemplo, eu já destaquei isso, temos que apresentar as possibilidades e fazer com que o autor da dúvida também aprenda, ninguém tem a obrigação de responder de forma 100% correta, o objetivo dos fóruns também é fazer com que as pessoas pensem....

    Mas alterei para atender a sua observação.


    isso mesmo cada um sugere conforme o q sabe. de qq forma seu script eh lento pois para cada codigo q processar tera q ler toda a tabela no update. se a tabela tiver milhao de linhas cada linha sera lida milhao x milhao de vezes.

    Avatar,

    Nem sempre podemos afirmar que uma Heap Table é tão ruim assim, dependendo do cenário, mesmo sem uma chave primária ou índice NonClustered, uma Heap Table pode até ser mais interessante, tudo depende do que esta sendo implementado.

    É justamente ai que podemos analisar e ver o que tem que ser melhorado, aplicando as chaves primárias, índices, ou até mesmo transformar uma CTE ou VIEW, quem sabe, existem possibilidades, vale a análise.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    terça-feira, 23 de junho de 2020 21:46
    Moderador
  • Pra mim pessoal responde de acordo com q sabe. Quem sabe muito apresenta possibilidades q nao precisa corrigir varias vezes. Quem sabe pouco apresenta possibilidades q tem q ser corrigida varias vezes.
    segunda-feira, 29 de junho de 2020 11:05
  • Pra mim pessoal responde de acordo com q sabe. Quem sabe muito apresenta possibilidades q nao precisa corrigir varias vezes. Quem sabe pouco apresenta possibilidades q tem q ser corrigida varias vezes.

    Avatar,

    Acho que você não entendeu quando eu fiz referência a "quem sabe", não estou dizendo de forma alguma que eu sei ou você não sabe, da minha parte isso não existe.

    Estava fazendo referência a quem sabe, como uma forma de dizer que existem diversas que possibilidades, era somente isso.

    No que tange a alterar ou mudar os exemplos, isso é um procedimento totalmente comum aqui nos fóruns, tenho a certeza que você vai ao longo de tempo realizar estas ações.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 29 de junho de 2020 22:55
    Moderador