El uso de las funciones MES y AÑO como se sugiere en la mayoría de las respuestas tiene la desventaja de que SQL Server no podrá usar ningún índice que pueda haber en su columna de fecha. Esto puede acabar con el rendimiento en una mesa grande.
Me inclinaría a pasar un valor DATETIME (por ejemplo, @StartDate) al procedimiento almacenado que representa el primer día del mes que le interesa.
Luego puede usar
SELECT ... FROM ...
WHERE DateColumn >= @StartDate
AND DateColumn < DATEADD(month, 1, @StartDate)
Si debe pasar el mes y el año como parámetros separados al procedimiento almacenado, puede generar un DATETIME que represente el primer día del mes usando CAST y CONVERT y luego proceda como se indicó anteriormente. Si hace esto, recomendaría escribir una función que genere un DATETIME a partir de valores enteros de año, mes y día, por ejemplo, lo siguiente de un blog de SQL Server .
create function Date(@Year int, @Month int, @Day int)
returns datetime
as
begin
return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1)
end
go
La consulta entonces se convierte en:
SELECT ... FROM ...
WHERE DateColumn >= Date(@Year,@Month,1)
AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))