Проблема с вашим текущим SQL в том, что скаляр возвращает только одно значение. Вам нужно использовать функцию табличного значения, чтобы получить несколько столбцов.
Это версия TVF, которая будет содержать три столбца
CREATE FUNCTION [dbo].[FunctionName]
(
@DateFormat AS DATETIME
)
RETURNS TABLE AS RETURN
(
SELECT DATEPART(YEAR,@DateFormat) AS [Year],
DATEPART(Month,@DateFormat) AS [Month],
DATEPART(Day,@DateFormat) AS [Day]
)
Пример использования:
DECLARE @dates TABLE (SomeDate DATE)
INSERT INTO @dates SELECT '01/25/2018'
INSERT INTO @dates SELECT '10/01/2008'
SELECT d.*,fn.* FROM @dates d
CROSS APPLY [dbo].[FunctionName](d.SomeDate) fn
И немного документации .
Тем не менее, мне лично не нравится эта реализация. Я бы просто ожидал, что операторы DATEPART в части SELECT SQL. Я думаю, что TVF делает его более сложным и не дает ощутимых преимуществ.