Disculpas @gnzsoloyo, se me paso. Aquí comparto el código. Basicamente genero los dias contenidos en un rango de fechas sin uso de while, el principio es el mismo y puede aplicarse para horas y o minutos. Espero les sirva.
Código SQL:
Ver originalCREATE DATABASE Demo
GO
USE Demo
GO
SET NOCOUNT ON
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.TallyTable') AND TYPE IN (N'U'))
DROP TABLE dbo.TallyTable
GO
CREATE TABLE dbo.TallyTable(ID INT NOT NULL, PRIMARY KEY(ID))
GO
DECLARE @I INT = 0 /* Puede iniciar en 0 ó 1 según se desee*/
DECLARE @IMax INT = 365*10 /*Para manejar operaciones de días con 10 años aproximadamente*/
WHILE @I<=@IMax
BEGIN
INSERT INTO dbo.TallyTable VALUES (@I)
SET @I=@I+1
END
USE Demo
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.Hospedaje') AND TYPE IN (N'U'))
DROP TABLE dbo.Hospedaje
GO
CREATE TABLE Hospedaje (
HospedajeId INT NOT NULL IDENTITY(1,1),
Cliente VARCHAR(100) NOT NULL,
FechaIngreso DATE NOT NULL,
FechaEgreso DATE NOT NULL
)
INSERT INTO dbo.Hospedaje(
Cliente ,
FechaIngreso ,
FechaEgreso
)
SELECT 'PEKERMAN', ' 20140504', '20140507'
USE Demo
GO
SELECT *, DATEADD(DAY, tt.id, h.FechaIngreso) Dia
FROM dbo.Hospedaje H
INNER JOIN dbo.TallyTable TT
ON DATEADD(DAY, tt.id, h.FechaIngreso)<= h.FechaEgreso
ORDER BY h.Cliente, tt.ID ASC
Los datos se verian algo así