我已經能夠解決我的問題,使用兩個臨時表,並使用它們中的每個值來計算大小差異。我不會說這是做這件事的最好方法,但它似乎適用於我想要做的事情。如果有這樣一個更簡單的方法,我仍然很想看到它。
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
編輯您的問題,包括樣本數據,預期產出和你已經嘗試了什麼至今 – JohnHC
您可能還需要考慮升級您的數據庫。 Microsoft不再支持2005年。 –
不幸的是,我沒有選擇使用什麼版本,否則我肯定會使用更高版本。 –