2010-10-15 7 views
12

Je suppose que ce n'est pas possible car le moteur ne l'aime pas, mais existe-t-il un moyen (sauf SQL dynamique) de passer un DATEPART comme paramètre à une procédure? Pourquoi ne pouvez-vous pas simplement passer la Date créée à partir de la DatePart?DATEPART en tant que paramètre

Répondre

10

Une option consiste à utiliser un cas avec le paramètre (il serait préférable d'utiliser une énumération int au lieu d'une chaîne):

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

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

exec spName @datepart 
+0

très bonne idée et je pense que vous serez ma réponse; cependant, je voulais passer en 'YEAR' ou 'MONTH', pas une date * apparemment * arbitraire. – Brad

2

Non. Il n'y a pas de type de données "année". Vous pouvez le faire:

CREATE PROC myproc @Year int, @Month tinyint 

Cela échoue parce qu'une partie DATEPART est un littéral

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

ou cela et un SI AUTRE

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

Si vous essayez de créer une procédure stockée dynamique, le code suivant pourrait vous aider à atteindre cet objectif.

Lorsque vous définissez le corps du sp, rappelez-vous que vous devez utiliser exec sql mot-clé pour exécuter la sentence 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 

Vous pouvez alors passer une phrase sql à votre procédure stockée en tant que dependig unique chaîne de vos besoins:

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

la meilleure solution est d'ajouter toujours mois (ou même plusieurs jours si vous en avez besoin à ce niveau) et de jouer avec des valeurs entières. Quelque chose comme ça

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

et je pense qu'il est clair comment ajouter un seul mois :)

Questions connexes