2010-10-15 16 views
12

Supongo que esto no es posible porque no le gusta al motor, pero ¿hay alguna manera (salvo SQL dinámico) de pasar un DATEPART como parámetro de un procedimiento?DATEPART como parámetro

Respuesta

10

Una opción es utilizar un caso con el parámetro (sería mejor usar una enumeración int en lugar de una cadena):

declare @part varchar(10) 
set @part = 'YEAR' 
select case @part 
      when 'YEAR' then datepart(yy, SomeDateTimeColumn) 
      when 'MONTH' then datepart(mm, SomeDateTimeColumn) 
      else datepart(dd, SomeDateTimeColumn) 
     end 
from SomeTable 
1

¿Por qué no puede simplemente pasar la fecha que se crea desde el Datepart?

DECLARE @datepart DATETIME 
SET @datepart = DATEPART(yyyy, GetDate()) 

exec spName @datepart 
+0

muy buena idea y creo que vas a ser mi respuesta; sin embargo, quería pasar 'AÑO' o 'MES', no una * fecha aparentemente arbitraria *. – Brad

2

No. No hay ningún tipo de datos "año". Usted puede hacer esto:

CREATE PROC myproc @Year int, @Month tinyint 

Esta falla porque DATEPART parte es un literal

DECLARE @part varchar(10) 
SET @part = 'month' 
SELECT DATEPART(@part, GETDATE()); 

o esto y un IF ELSE

CREATE PROC myproc @WhoeDate datetime, @part varchar(10) /* year. month etc*/ 
0

Si está intentando crear un procedimiento almacenado dinámico, el siguiente código podría ayudarlo a lograrlo.

Cuando se define el cuerpo del sp, recordar que es necesario utilizar EXEC SQL palabra clave para ejecutar la sentencia SQL:

create proc sp_dinamic_procedure(@datepart_sql varchar(20), @datepart_var varchar(8)) 
as 
begin 
    declare @query varchar(100) 
    select @query = "select date from table1 t1 where datepart(" + @datepart_var + ", t1.fecha1) = " + @datepart_sql 
    exec @query 
end 

entonces puede pasar cualquier sentencia de SQL en el procedimiento almacenado como una dependig sola cadena en sus necesidades:

declare @datepart_sql varchar(20), @datepart_var varchar(8) 
select @datepart_sql = "datepart(year,getdate()", @datepart_var = "year" 
exec sp_dinamic_procedure @datepart_sql, @datepart_var 
0

mejor solución es añadir siempre meses (o incluso días, si lo necesita en ese nivel) y jugar con valores enteros. Algo como esto

DECLARE @AddMonths INT = 12 
SELECT 
    Sales_DateTime, DATEADD(DAY, -1, DATEADD(MONTH, @AddMonths, DATEADD(DAY, 1, Sales_DateTime))) 
FROM tSales 

y yo creo que está claro cómo agregar sólo un mes :)

Cuestiones relacionadas