CALCULATE SQL ROWS

/****** Object:  StoredProcedure [dbo].[CALCULATEROWS]    Script Date: 22.01.2019 15:49:46 ******/
-- EXEC [CALCULATEROWS]
SET ANSI_NULLS ON;
GO

SET QUOTED_IDENTIFIER ON;
GO

CREATE PROC [dbo].[CALCULATEROWS]
AS
IF NOT EXISTS
(
    SELECT TOP 1
           1
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE'
          AND TABLE_NAME = '_ROWCOUNTS'
)
BEGIN
    CREATE TABLE _ROWCOUNTS
    (
        TABLENAME VARCHAR(255) NULL,
        OLDROWCOUNT INT NULL,
        NEWROWCOUNT INT NULL
    );
END;

CREATE TABLE #COUNTS
(
    TABLENAME VARCHAR(255),
    ROWCOUNT_ INT
);

EXEC sp_MSforeachtable @command1 = 'INSERT #COUNTS (TABLENAME, ROWCOUNT_) SELECT "?", COUNT(*) FROM ?';

DECLARE @CRSR CURSOR;
DECLARE @TN NVARCHAR(250);
BEGIN
    SET @CRSR = CURSOR FOR
    SELECT TABLENAME
    FROM #COUNTS;

    OPEN @CRSR;
    FETCH NEXT FROM @CRSR
    INTO @TN;

    WHILE @@FETCH_STATUS = 0
    BEGIN

        IF NOT EXISTS (SELECT TOP 1 1 FROM _ROWCOUNTS WHERE TABLENAME = @TN)
        BEGIN
            INSERT INTO _ROWCOUNTS
            (
                TABLENAME,
                OLDROWCOUNT,
                NEWROWCOUNT
            )
            VALUES
            (   @TN,
                (
                    SELECT TOP 1 ROWCOUNT_ FROM #COUNTS WHERE TABLENAME = @TN
                ),
                (
                    SELECT TOP 1 ROWCOUNT_ FROM #COUNTS WHERE TABLENAME = @TN
                ));
        END;
        ELSE
        BEGIN
            UPDATE _ROWCOUNTS
            SET OLDROWCOUNT = NEWROWCOUNT
            WHERE TABLENAME = @TN;
            UPDATE _ROWCOUNTS
            SET NEWROWCOUNT =
                (
                    SELECT TOP 1 ROWCOUNT_ FROM #COUNTS WHERE TABLENAME = @TN
                )
            WHERE TABLENAME = @TN;
        END;

        FETCH NEXT FROM @CRSR
        INTO @TN;
    END;

    CLOSE @CRSR;
    DEALLOCATE @CRSR;
END;

DROP TABLE #COUNTS;
SELECT *,
       (NEWROWCOUNT - OLDROWCOUNT) AS DIFFERENCE_
FROM _ROWCOUNTS
WHERE (NEWROWCOUNT - OLDROWCOUNT) > 0
ORDER BY DIFFERENCE_ DESC;

GO

Leave a comment