#sql #sql-server #sql-server-2005
#sql #sql-сервер #sql-server-2005
Вопрос:
Есть ли способ сохранить параметр DATEPART в ТАБЛИЦЕ, чтобы позже я мог передать его в качестве переменной в DATEADD (…). Что-то вроде этого
CREATE TABLE abc
(
Freq <some DATEPART type>,
FromDate DATE,
NumOfDays INT
)
и затем, на мой взгляд
CREATE VIEW abc
AS
SELECT DATEADD(Freq, NumOfDays, FromDate)
FROM abc
(да, я знаю, что могу сделать это из ДИНАМИЧЕСКОГО SQL, но представления не принимают динамический sql, и я бы хотел избежать использования динамического sql).
Комментарии:
1. Из документов MSDN: datepart — это часть date (значение даты или времени), для которой будет возвращено целое число. Эквиваленты пользовательских переменных недопустимы. — это означало бы, что нет способа сохранить и передать тип, который
DATEPART
вы хотите, в эту функцию. Динамический SQL илиCASE
оператор — ваши единственные варианты
Ответ №1:
Если вы не хотите использовать динамический SQL, нет.
Поскольку существует ограниченное количество DateParts, вы потенциально могли бы использовать CASE
инструкцию типа:
SELECT CASE
WHEN Freq = 'Year' THEN DATEADD(Year, NumOfDays, Fromdate)
WHEN Freq = 'Day' THEN DATEADD(Day, NumOfDays, FromDate)
... END as 'MyField'
FROM Abc
Комментарии:
1. Это именно то, что у меня было … пытался обойти и это.
2. @Denis — если вам не нужен оператор case или динамический SQL, то нет, вы не можете делать то, что хотите. Есть ли причина не выполнять
CASE
инструкцию?
Ответ №2:
Выглядит не очень хорошо, но может быть примерно так
SELECT
Case Freq
WHEN 'yyyy' THEN DATEADD(yyyy, NumOfDays, FromDate)
WHEN 'yy' THEN DATEADD(yy, NumOfDays, FromDate)
WHEN 'mm' THEN DATEADD(mm, NumOfDays, FromDate)
...
END