‘DATEFROMPARTS’ не является распознанным именем встроенной функции — ошибка SQL Server 2008

#sql #sql-server-2008 #sql-function

#sql #sql-server-2008 #sql-функция

Вопрос:

 Declare  @i int=1;
select FORMAT(DATEFROMPARTS(1900, @i, 1), 'MMM', 'en-US')
  

Я получаю сообщение об ошибке при выполнении в SQL Server 2008.

‘DATEFROMPARTS’ не является распознанным именем встроенной функции.

Комментарии:

1. Это новая функция в SQL Server 2012 , и она недоступна в более старых версиях.

2. вы также обнаружите, что ФОРМАТ там не работает

Ответ №1:

DATEFROMPARTS был введен в SQL Server 2012. SQL Server 2008 (неподдерживаемая версия SQL Server) ничего не знает об этой функции. Если вам нужна эта функциональность в SQL 2008, вам нужно будет создать свою реализацию. Пример:

 CREATE FUNCTION dbo.udf_DateFromParts (@year int, @month int, @day int)
RETURNS date
AS
BEGIN
    RETURN DATEADD(day, @day-1, DATEADD(month, @month-1, DATEADD(year, @year-1, CAST('0001-01-01' AS date))));
END;
GO
  

Аналогично, FORMAT также было введено в SQL Server 2012. Для этого вам понадобится значение функции SQLCLR.

Комментарии:

1. CLR кажется излишним для сопоставления номера месяца с одной из 12 возможных строк

2. @MartinSmith, это верно для данного конкретного варианта использования. Я думал о замене всей FORMAT функциональности.

Ответ №2:

Если вам нужно название месяца, используйте datename() :

 select left(datename(month,
                     convert(date,
                             convert(varchar(255), 19000001   @i * 100
                                    )
                            )
                     ), 3)
  

Явное преобразование в date, с технической точки зрения, не требуется:

 select left(datename(month, convert(varchar(255), 19000001   1 * 100)), 3)
  

Комментарии:

1. Это не эквивалентно исходному коду. Вам потребуется LEFT(,3)

2. Нет проблем. Заранее поздравляем с достижением 1 миллиона повторений!

3. @MartinSmith . . . Пока нет . . . когда я пишу это 999 325.

Ответ №3:

Ни одна из вызываемых вами встроенных функций не существует в SQL Server 2008

Лично я бы не стал утруждать себя построением даты из номера месяца, а затем вызовом функции для получения сокращенной строки месяца в любом случае.

Вы можете использовать

 SELECT SUBSTRING('JanFebMarAprMayJunJulAugSepOctNovDec',@i*3-2,3)