Cursor

Um certo mito é em cima de um recurso simples mas muito útil nos bancos de dados com SQL Server. O Cursor permite que o DBA percorra uma tabela virtual e execute comandos como um FOR EACH em C#. Abaixo um exemplo simples de uso.

Esse script percorre nossa tabela de produtos e faz exclusão nas tabelas de estoque para produtos que tenham sido movimentados sem SKU, deixando o estoque do SKU somente. Rolo é um identificador unico para o nosso estoque, para industria têxtil.

SET NOCOUNT ON;

DECLARE @CodigoProduto varchar(36)
DECLARE @QuantidadeTotalLinhasExcluida int

——– Lista os produtos ——–

DECLARE produtosCursor CURSOR FOR
SELECT ProductID
FROM ProdutcsTable
WHERE ManufactProduct = 0;

OPEN produtosCursor

FETCH NEXT FROM produtosCursor
INTO @CodigoProduto

SET @QuantidadeTotalLinhasExcluida = 0

WHILE @@FETCH_STATUS = 0
BEGIN

— Verifica se o produto tem movimento de estoque com rolo

DECLARE @QuantidadeEstoqueRolo int

SET @QuantidadeEstoqueRolo = ( SELECT COUNT(*) FROM StockTable WHERE FK_ProdutoId = @CodigoProduto AND @CodigoRolo <> ” )

IF (@QuantidadeEstoqueRolo > 0)
BEGIN

SET @QuantidadeTotalLinhasExcluida = @QuantidadeTotalLinhasExcluida + @QuantidadeEstoqueRolo

PRINT @CodigoProduto + ‘ >> ‘ + CAST(@QuantidadeEstoqueRolo AS VARCHAR);

DELETE FROM StockTableByDay WHERE FK_ProductId = @CodigoProduto AND @CodigoRolo = ”
DELETE FROM StockTable WHERE FK_ProductId = @CodigoProduto AND @CodigoRolo = ”

END

FETCH NEXT FROM produtosCursor
INTO @CodigoProduto
END

PRINT CAST(@QuantidadeTotalLinhasExcluida AS VARCHAR) + ‘ Linhas’;

CLOSE produtosCursor;
DEALLOCATE produtosCursor;

Tags: