none
Procedure sem cursor RRS feed

  • Pergunta

  • Olá pessoal,

    Tenho esta procedure que utiliza cursor. Tentei de todas a todas as formas que conheço mas não consegui escreve-la usando while no lugar do cursor.

     

    Alguém tem algo parecido para usar como modelo?

     

    Grato

    Dirceu

     

    set ANSI_NULLS ON

    set QUOTED_IDENTIFIER ON

    GO

    ALTER PROCEDURE [dbo].[USP_Pec_02_Artigos_Lista]

    @QtdePagina As Int,

    @vCategoria As Varchar(50),

    @PagAtual As Int,

    @TotalArtigos As Int OUTPUT

    AS

    DECLARE @ch_top AS Int

    DECLARE @Titulo As Varchar(200)

    DECLARE @Data As DateTime

    DECLARE @QtdeInicial As Int

    DECLARE @Contador As Int

    SET @QtdeInicial = 0

    SET @Contador = 0

    SET NOCOUNT ON

    CREATE TABLE #ArtigosTemp

    (

    ch_top int,

    Titulo Varchar(200),

    Data DateTime

    )

    DECLARE curPaginacaoArtigos CURSOR FAST_FORWARD FOR

    SELECT ch_top, Titulo, Data FROM Tb_Pec_02_Artigos where Categoria=@vCategoria order by Data Desc

    OPEN curPaginacaoArtigos

    FETCH NEXT FROM curPaginacaoArtigos

    INTO @CH_TOP,@Titulo, @Data

    WHILE @@FETCH_STATUS = 0

    BEGIN

    IF @QtdeInicial >= (@PagAtual * @QtdePagina) - @QtdePagina

    BEGIN

    INSERT INTO #ArtigosTemp VALUES(@CH_TOP, @Titulo, @Data )

    SET @Contador = @Contador + 1

    IF @Contador >= @QtdePagina

    BREAK

    END

    SET @QtdeInicial = @QtdeInicial + 1

    FETCH NEXT FROM curPaginacaoArtigos

    INTO @CH_TOP, @Titulo, @Data

    END

    CLOSE curPaginacaoArtigos

    DEALLOCATE curPaginacaoArtigos

    SELECT ch_top, Titulo, Data FROM #ArtigosTemp

    DROP TABLE #ArtigosTemp

    SET NOCOUNT OFF

    SET @TotalArtigos = (SELECT COUNT(ch_top) FROM Tb_Pec_02_Artigos where Categoria=@vCategoria )

     

    terça-feira, 29 de maio de 2007 11:31

Todas as Respostas

  • Dirceu,

     

    O modelo que eu te passei não ajudou?

     

    Veja se este outro te ajuda.

     

     

    Create Procedure dbo.ReorganizarNumTeste
      As
     

    Declare @NumTeste Int, @Contador Int
      Set @NumTeste=1

     

      Select @Contador=Count(NumTeste) From CTBaloes
       Where DatePart(Month,DataTeste)=Month(GetDate())
       And    DatePart(Year,DataTeste)=Year(GetDate())

     

    While @NumTeste <= @Contador
       Begin
        Set @NumTeste=@NumTeste+1

        Begin Transaction
         Update CTBaloes
         Set NumTeste=@NumTeste
         Where DatePart(Month,DataTeste)=Month(GetDate())
        
         If @@ERROR <> 0
          Begin      
           ROLLBACK  TRANSACTION
           Break
           RETURN
          End

        Else
           Commit Transaction

    End

     

    terça-feira, 29 de maio de 2007 12:25
  • Grande,

     Joga um identity nessa sua tabela temporária.

    Feito isso faça um select do menor registro da sua tabela( SELECT MIM) e guarde-o em uma variável.

    ex:

     

    SELECT @TESTE  = MIN(ID_FUNCIONARIO)

    FROM funcionario

     

    Sendo assim construa um while enquando essa variável dor NOT NULL

    EX:

    WHILE @TESTE IS NOT NULL

     

    faça tudo que tiver que fazer e na última linha do while vc faça a mesma consulta de cima sendo que agora vc coloca uma cláusula where com o id atual > que o id anterior.

    Ex:

     

    Select MIN(id_funcionario)

    from funcionario

    where id_funcionario > @TESTE 

     

    Quando for o último registro ele vai ser nulo assim saindo do loop

     

    Esperoi ter ajudado. Qualquer dúvida me manda e-mail que te mando um ecemplo

    chapolin.rio@gmail.com

     

    Abraço

     

    sexta-feira, 20 de julho de 2007 20:10