Как вызвать функцию для каждой записи во временной таблице без использования курсоров - PullRequest
0 голосов
/ 17 октября 2019

Итак, у меня есть временная таблица A , которая содержит 2 столбца (Id, Date). Мне нужно вызвать функцию для каждого идентификатора в таблице A , передать в функцию параметр даты. Поскольку функция выводит записи для предыдущего вызова, мне нужно вставить Id + выход функции в таблицу B .

Первое, что приходит мне в голову, когда дело касаетсяс этой проблемой просто с помощью курсора, однако, мне интересно, можно ли это сделать другим способом.

спасибо

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Давайте создадим временную таблицу и заполним ее примерами данных

CREATE TABLE #testr
(ID  INT, 
 DAT DATE
);  
INSERT INTO #testr
VALUES
(1, 
 '20190101'
),
(2, 
 '20190201'
);

Итак, оператор SELECT создает что-то похожее на изображение ниже

enter image description here

Давайте создадим простую скалярную функцию, как показано во фрагменте ниже. Функция возвращает дату месяца как целое число.

CREATE FUNCTION dbo.TestFunct
(@DATE DATETIME
)
RETURNS INT
WITH EXECUTE AS CALLER
AS
     BEGIN
         DECLARE @result INT;
         SET @result = DATEPART(MONTH, @DATE);
         RETURN(@result);
     END;

Давайте попробуем с оператором APPLY

-- INSERT INTO the second table 
SELECT RESULT.R + id
FROM #testr T
     CROSS APPLY
(
    SELECT dbo.TestFunct(T.DAT) R
) RESULT;

Результат показан на рисунке ниже.

enter image description here

1 голос
/ 17 октября 2019

Вы можете использовать apply для вызова табличной функции с использованием параметров из других таблиц:

select . . .
from t cross apply
     dbo.func(t.date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...