2015-04-29 151 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,我已经退出了我的答案。 –

相关问题