2010-10-15 60 views
12

我猜這是不可能的,因爲引擎不喜歡它,但是有沒有一種方法(禁止動態SQL)將DATEPART作爲參數傳遞給過程?DATEPART作爲參數

回答

10

一種選擇是使用CASE與參數(最好使用int枚舉而不是字符串):

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

爲什麼你不能只傳入從Datepart創建的日期?

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

exec spName @datepart 
+0

很好的想法,我想你是我的答案;然而,我想通過'年'或'月',而不是某些*表面上*任意日期。 – Brad 2010-10-15 15:47:34

2

不。沒有「年」數據類型。你可以這樣做:

CREATE PROC myproc @Year int, @Month tinyint 

失敗的原因是DATEPART部分是文字

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

或本和IF ELSE

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

如果您嘗試創建動態存儲過程,則可以通過以下代碼來幫助您實現此目的。

當你定義SP的身體,記住,你需要使用EXEC SQL鍵字來執行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 

然後,你可以通過任何SQL語句到你的存儲過程作爲一個您的需要單個字符串dependig:

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

最好的解決辦法是(如果你需要它在該級別甚至幾天),以隨時添加個月,並與整數值玩。事情是這樣的

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

,我想很明顯如何一個月只添加:)