我已经能够使用两个临时表并使用每个临时表中的值来计算大小差异来解决我的问题。我不会说这是最好的方法,但它似乎适用于我想做的事情。如果有更简单的方法,我仍然希望看到它。
ALTER PROCEDURE [dbo].[TableGrowthReport]
@NoOWeeks int,
@TableName varchar(15)
AS
--Declares & sets variables
DECLARE @CurrentDate DATETIME
DECLARE @CalcDate DATETIME
SET @CurrentDate = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SET @CalcDate = DATEADD(ww, @NoOWeeks, @CurrentDate)
CREATE TABLE #Data
(
RowNo int,
EXTRACT_DATE varchar(19),
TABLE_NAME varchar(128),
NUMBER_ROWS bigint,
DATA_SIZE bigint,
DATA_SIZE2 bigint,
);
CREATE TABLE #Data2
(
RowNo int,
DATA_SIZE2 bigint
);
INSERT INTO #Data
(RowNo,
EXTRACT_DATE,
TABLE_NAME,
NUMBER_ROWS,
DATA_SIZE,
DATA_SIZE2)
SELECT
ROW_NUMBER() OVER (ORDER BY EXTRACT_DATE desc) as RowNo,
EXTRACT_DATE,
TABLE_NAME,
NUMBER_ROWS,
DATA_SIZE,
NULL
FROM M3Rows_PF
WHERE TABLE_NAME = @TableName
AND EXTRACT_DATE >
(SELECT CONVERT(varchar(10), @CalcDate, 20));
INSERT INTO #Data2
(RowNo,
DATA_SIZE2)
SELECT
RowNo,
DATA_SIZE
FROM
(
SELECT
ROW_NUMBER() OVER (ORDER BY EXTRACT_DATE desc) - 1 as RowNo,
EXTRACT_DATE,
TABLE_NAME,
NUMBER_ROWS,
DATA_SIZE
FROM M3Rows_PF
WHERE TABLE_NAME = @TableName
AND EXTRACT_DATE >
(SELECT CONVERT(varchar(10), @CalcDate, 20))
)r
WHERE rowno > 0;
UPDATE a
SET DATA_SIZE2 = b.DATA_SIZE2
FROM #Data a
JOIN #Data2 b ON a.RowNo = b.RowNo
WHERE a.RowNo = b.RowNo
SELECT
RowNo,
EXTRACT_DATE,
TABLE_NAME,
NUMBER_ROWS,
DATA_SIZE,
DATA_SIZE2,
CASE
WHEN DATA_SIZE > 0 AND DATA_SIZE < 10000000
THEN LEFT(DATA_SIZE * 1.0 / 10000, 4) + 'kb'
WHEN DATA_SIZE >= 10000000 AND DATA_SIZE < 1000000000
THEN LEFT(DATA_SIZE * 1.0 / 1000000, 5) + 'mb'
ELSE
LEFT(DATA_SIZE * 1.0 / 1000000000, 5) + 'gb' END AS DATA_SIZECONV,
DATA_SIZE - DATA_SIZE2 AS SIZE_DIFF,
LEFT((DATA_SIZE - DATA_SIZE2) * 1.0 / 1000000, 5) AS SIZE_DIFFmb
FROM #data
WHERE TABLE_NAME = @TableName
AND EXTRACT_DATE >
(SELECT
CONVERT(varchar(10), @CalcDate, 20)
)
DROP TABLE #Data
DROP TABLE #Data2