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
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
¿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
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*/
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
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 :)
- 1. enviar datepart como parámetro de una tabla a la función DATEADD en el servidor sql
- 2. Oracle equivalente a SQL Server DATEPART
- 3. función como parámetro vs puntero de función como parámetro
- 4. matriz como parámetro
- 5. jQuery: $ como parámetro
- 6. Pase ViewBag como parámetro
- 7. número de la semana incorrecto usando DATEPART en SQL Server
- 8. C# SQL Arriba como parámetro
- 9. C++ Pasando ostream como parámetro
- 10. Pasando nueva estructura como parámetro
- 11. Lambda \ Función anónima como parámetro
- 12. Clase con objeto como parámetro
- 13. C++ pasar enumeración como parámetro
- 14. Parámetro de plantilla como amigo
- 15. Pase un método como parámetro
- 16. ¿Pasa una clase como parámetro?
- 17. C++ utilizando 'esto' como parámetro
- 18. ¿Cómo paso @selector como parámetro?
- 19. ¿Pasar URL como parámetro get?
- 20. Fecha de paso como parámetro para un informe de informe interno/otro para usar como parámetro
- 21. parámetro de evento; "remitente como Objeto", o "remitente como T"?
- 22. Especificador de precisión como parámetro como printf pero en String.Format
- 23. C# Escriba el parámetro como declaración genérica
- 24. ¿Cómo se pasa un Container.DataItem como parámetro?
- 25. Pasando el parámetro como final en C#
- 26. ¿Pasar una función como parámetro en jQuery?
- 27. Cómo pasar predicado como parámetro de función
- 28. C# use System.Type como parámetro genérico
- 29. pasar un array como parámetro en JavaScript
- 30. Bloque de paso Objective-C como parámetro
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