2010-10-15 2 views
12

Я предполагаю, что это невозможно, поскольку движок ему не нравится, но есть ли способ (запрет динамического SQL) передать в DATEPART в качестве параметра процедуры?DATEPART как параметр

ответ

10

Одним из вариантов является использование СЛУЧАЙ с параметром (лучше было бы использовать перечисление 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

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

Если вы пытаетесь создать динамическую хранимую процедуру, следующий код поможет вам в этом.

При определении тело зр, помните, что вам нужно использовать 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 

, и я думаю, что это ясно, как добавить еще один месяц только :)

Смежные вопросы