Сохранение части данных в таблице

#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