Prueba esto:
Declare @DayOfMonth TinyInt Set @DayOfMonth = 13
Declare @Month TinyInt Set @Month = 6
Declare @Year Integer Set @Year = 2006
-- ------------------------------------
Select DateAdd(day, @DayOfMonth - 1,
DateAdd(month, @Month - 1,
DateAdd(Year, @Year-1900, 0)))
También funciona, tiene el beneficio adicional de no realizar ninguna conversión de cadenas, por lo que es un procesamiento aritmético puro (muy rápido) y no depende de ningún formato de fecha. valor cuya primera parte es un número entero que representa el número de días desde el 1 de enero de 1900, y la segunda parte es una fracción decimal que representa la parte fraccionaria de un día (por el tiempo) --- Por lo tanto, el valor entero es 0 (cero) siempre se traduce directamente a la medianoche del 1 de enero de 1900...
o, gracias a la sugerencia de @brinary,
Select DateAdd(yy, @Year-1900,
DateAdd(m, @Month - 1, @DayOfMonth - 1))
Editado en octubre de 2014. Como señaló @cade Roux, SQL 2012 ahora tiene una función integrada:DATEFROMPARTS(year, month, day)
que hace lo mismo.
Editado el 3 de octubre de 2016 (gracias a @bambams por darse cuenta de esto y a @brinary por solucionarlo), la última solución, propuesta por @brinary. no parece funcionar para los años bisiestos a menos que primero se realice la suma de años
select dateadd(month, @Month - 1,
dateadd(year, @Year-1900, @DayOfMonth - 1));