Inquiridor
Procedure sem cursor

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 ONset
QUOTED_IDENTIFIER ONGO
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 )
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=1Select @Contador=Count(NumTeste) From CTBaloes
Where DatePart(Month,DataTeste)=Month(GetDate())
And DatePart(Year,DataTeste)=Year(GetDate())While @NumTeste <= @Contador
Begin
Set @NumTeste=@NumTeste+1Begin Transaction
Update CTBaloes
Set NumTeste=@NumTeste
Where DatePart(Month,DataTeste)=Month(GetDate())
If @@ERROR <> 0
Begin
ROLLBACK TRANSACTION
Break
RETURN
EndElse
Commit TransactionEnd
-
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
Abraço