2015-04-29 204 views
0

我想在存儲過程中實時填充日期時間列。下面是我目前所做的查詢,但會降低查詢性能。填充日期時間列

CREATE TABLE #TaxVal 
(
    ID   INT 
    , PaidDate DATETIME 
    , CustID INT 
    , CompID INT 
) 

INSERT INTO #TaxVal(ID, PaidDate, CustID, CompID) 
VALUES(01, '20150201',12, 100) 
    , (03,'20150301', 18,101) 
    , (10,'20150401',19,22) 
    , (17,'20150401',02,11) 
    , (11,'20150411',18,201) 
    , (78,'20150421',18,299) 
    , (133,'20150407',18,101) 

-- SELECT * FROM #TaxVal 

DECLARE @StartDate DATETIME = '20150101' 
    , @EndDate  DATETIME = '20150501' 

DECLARE @Tab TABLE 
(
    CompID INT 
    , DateField DATETIME 
) 

DECLARE @T INT 
SET @T = 0 
WHILE @EndDate >= @StartDate + @T 
BEGIN 
    INSERT INTO @Tab 
    SELECT CompID 
     , @StartDate + @T AS DateField 
    FROM #TaxVal 
    WHERE CustID = 18 
     AND CompID = 101 
    ORDER BY DateField DESC 

    SET @T = @T + 1 
END 

SELECT DISTINCT * FROM @Tab 

DROP TABLE #TaxVal 

哪種編寫此查詢的最佳方法是爲了獲得更好的性能?

+0

嘗試一個公用表表達式(CTE)或使用_numbers table_來生成一組日期並一次插入它們。搜索** sql服務器生成日期**應該讓你開始。提示:使用適當的軟件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服務器2014'。語法和功能的差異往往會影響答案。 – HABO

+0

能否請您舉個例子。謝謝 – dLight

回答

1

更改此:

DECLARE @T INT 
SET @T = 0 
WHILE @EndDate >= @StartDate + @T 
BEGIN 
    INSERT INTO @Tab 
SELECT CompID 
    , @StartDate + @T AS DateField 
FROM #TaxVal 
WHERE CustID = 18 
    AND CompID = 101 
ORDER BY DateField DESC 

SET @T = @T + 1 
END 

這樣:

;with cte as(
select cast('20150101' as date) as d 
union all 
select dateadd(dd, 1, d) as d from cte where d < '20150501' 
) 
INSERT INTO @Tab 
SELECT CompID, d 
FROM #TaxVal 
cross join cte 
WHERE CustID = 18 AND CompID = 101 
Option(maxrecursion 0) 

這裏是recursive common table expression獲得在範圍內的所有日期。然後你做一個cross join並插入。請注意,插入時無法順序設置。

+0

謝謝。我得到錯誤聲明終止。報表完成前,最大遞歸100已用盡。 – dLight

+0

@dLight,查看最後的編輯。選項(maxrecurtion 0) –

0

;with cte as(
select cast('20150101' as date) as d 
union all 
select dateadd(dd, 1, d) as d from cte where d < '20150501' 
) 
INSERT INTO @Tab 
SELECT CompID, d 
FROM #TaxVal 
cross join cte 
WHERE CustID = 18 AND CompID = 101 

的Giorgi的回答會的工作,但要小心遞歸CTE的。如果日期範圍很大,您很快就會達到最大遞歸級別。通常情況下,使用的數字表很像HABO提到的。這只是一個只有一個整數的列,所以行將是1,2,3,4,5等。然後,您可以加入Numbers表(外部應用適用於此),並將數字與dateadd來獲得你的增量日期。另請注意,您可能會遇到Numbers表格沒有包含足夠日期範圍的行的問題。

+0

爲了不達到限制,使用選項(maxrecuraion 0)。 Thx,我已經退出了我的答案。 –

相關問題