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;