Meine Vorliebe für diese Art der Sache ist, eine tally Tabelle zu verwenden. Ich behalte jedes System im Auge, das so aussieht.
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
GO
Auf diese Weise habe ich jederzeit einen Tally-Tisch an meinen Fingerspitzen. Sie können mehr über Tally-Tabellen lesen und wie sie hier Loops ersetzen. http://www.sqlservercentral.com/articles/T-SQL/62867/
Um Ihr aktuelles Problem zu lösen, wird dies ziemlich einfach. Zuerst brauchen wir eine Tabelle und einige Beispieldaten.
create table #Guest
(
GuestID int identity
, ArrivalDate date
, DepartureDate date
)
insert #Guest
select '2016-06-01', '2016-06-15' union all
select '2016-07-01', '2016-07-12'
Hier ist, wo die Macht der Tally-Tabelle wirklich zeigt. Die Ausgabe für Ihre Herausforderung ist so einfach wie dieser Code.
SELECT GuestID
, ArrivalDate
, DepartureDate
, DATEADD(Day, N - 1, ArrivalDate) as EachDate
from #Guest g
join cteTally t on t.N <= DATEDIFF(day, ArrivalDate, DepartureDate) + 1
order by GuestID
, EachDate
Der andere große Vorteil dieser Art von Ansatz über eine rekursiven CTE ist, dass Sie verwenden, was als Dreieck bekannt ist, verbinden und können einige Performance-Probleme verursachen. Hier finden Sie weitere Informationen zu Dreiecksverbindungen. http://www.sqlservercentral.com/articles/T-SQL/61539/
ich versucht, aber es doesn arbeite nicht. mit Daten als ( SELECT GuestID, Ankunftstag als reserveddate von dbo.Guest Vereinigung all SELECT GuestID, dateadd (Tag, 1, dbo.Guest. Ankunftstag) als reserveddate von dbo.Guest wo dateadd (Tag, 1, dbo.Guest. ArrivalDate)
Sie müssen 'dates' zu' dbo.Guest 'im rekursiven Teil der Abfrage beitreten. – gofr1
wie kann ich das tun –