Il n'y a pas besoin d'utiliser un curseur. L'approche basée sur les ensembles consisterait à utiliser une table Calendrier. Alors d'abord, nous faisons notre table de calendrier qui doit être effectuée qu'une seule fois et être un peu permanent:
Create Table dbo.Calendar (Date datetime not null Primary Key Clustered)
GO
; With Numbers As
(
Select ROW_NUMBER() OVER(ORDER BY S1.object_id) As [Counter]
From sys.columns As s1
Cross Join sys.columns As s2
)
Insert dbo.Calendar([Date])
Select DateAdd(d, [Counter], '19000101')
From Numbers
Where [Counter] <= 100000
GO
Je peuplé avec une 100K dates qui va en 2300. Évidemment, vous pouvez toujours développer. Ensuite, nous générons nos données de test:
Create Table dbo.Data(Id int not null, [Name] nvarchar(20) not null)
GO
Insert dbo.Data(Id, [Name]) Values(42,'South Yorkshire')
Insert dbo.Data(Id, [Name]) Values(43, 'Lancashire')
Insert dbo.Data(Id, [Name]) Values(44, 'Norfolk')
GO
Maintenant, le problème trivial devient:
Declare @Start datetime
Declare @End datetime
Set @Start = '2010-01-01'
Set @End = '2010-01-03'
Select Dates.[Date], Id, [Name]
From dbo.Data
Cross Join (
Select [Date]
From dbo.Calendar
Where [Date] >= @Start
And [Date] <= @End
) As Dates
Ca me plaît, ça veut dire que la table principale n'est scannée qu'une seule fois. –
Merci, c'est exactement ce que j'essayais de réaliser. – Kashif