【发布时间】:2016-07-06 12:57:22
【问题描述】:
我有一个包含详细信息(状态、ID、标题等)以及开始日期和结束日期的主表。需要当前年度的每月有效详细信息。
我做了这样的事情,它给了我每月的记录,但没有考虑年份。当表行增加时,这段代码太慢了。请帮帮我。
DECLARE @LoopCounter INT,
@Max INT,
@MonthName NVARCHAR(100),
@TransStatus int,
@Year int
BEGIN
SELECT @LoopCounter = min(id), @Max = max(Id)
FROM TableName
CREATE TABLE #Active
(
Id INT IDENTITY(1,1),
Month varchar(30)
)
WHILE (@LoopCounter <= @Max)
BEGIN
INSERT into #Active
SELECT DateName(MONTH, DATEADD(MONTH, nos.monthnos, (Select StartDate from TableName where id=@LoopCounter And Year(StartDate)=@Year)-1 ) )
FROM (SELECT 1 monthnos
UNION SELECT 2
UNION SELECT 3
UNION SELECT 4
UNION SELECT 5
UNION SELECT 6
UNION SELECT 7
UNION SELECT 8
UNION SELECT 9
UNION SELECT 10
UNION SELECT 11
UNION SELECT 12) nos
WHERE nos.monthnos <= DATEDIFF(MONTH, (Select StartDate from TableName where id=@LoopCounter),
(Select EndDate from TableName where id=@LoopCounter)+1 )
SET @LoopCounter = @LoopCounter + 1
END
END
SELECT COUNT(*) As ActiveCount, Month
FROM #Active
GROUP BY Month
【问题讨论】:
-
您正在使用循环插入数据。难怪它太慢了。也许如果您能解释该代码在做什么,我们可以帮助您找到基于集合的方法。代码的格式对我来说实在是太麻烦了,无法尝试破译。
-
如果您只使用上述查询生成月份,您希望您的查询如何考虑几年?我建议您在问题中添加一些示例数据和预期输出。一旦人们对您的问题有了一点直观了解,也许它会更有意义,记住一件事,当您要在 sql server 中编写 while 循环时,退后一步想想,几乎总是有更好的方法这样做。
标签: sql-server