Кросс-аппликация или внутреннее соединение как подзапрос для TVF - PullRequest
1 голос
/ 30 мая 2019

Ситуация:

У меня есть TVF с одним параметром DATE.Я хочу, чтобы пользователь мог ввести список строк в качестве дополнительного параметра.Я знаком с пользовательскими типами, но не хочу его использовать.

Функция: dbo.fnExample(@StartDate)

Вот мои два варианта: Опция 1

SELECT base.*
FROM (SELECT * FROM dbo.fnExample('2019-05-01')) AS base
INNER JOIN ( VALUES
('something'),
('something2'),
('n'),
(...)) AS base2(ColumnA)
ON base.ColumnA=base2.ColumnA

Опция 2 (не работает, потому что я не уверен, как соединить этот столбец с cross apply).

SELECT *
FROM ( VALUES
('something'),
('something2'),
('n'),
(...)) AS base2(ColumnA)
CROSS APPLY dbo.fnExample('2019-05-01')

Цель:

У меня вопрос в три раза.Что бы иметь лучшую производительность?Есть ли другие варианты, не упомянутые выше, которые могли бы быть лучше?Каковы ограничения от предложенных вариантов?Спасибо за вашу помощь!

1 Ответ

1 голос
/ 30 мая 2019

Я думаю, что вы хотите JOIN, а не APPLY:

SELECT *
FROM dbo.fnExample('2019-05-01') f JOIN
     ( VALUES ('something'), ('something2'), ('n'), (...)
     ) AS base2(ColumnA)
     ON  f.columnA = base2.ColumnA;

То есть табличные функции не должны вызываться с использованием APPLY. APPLY - это способ передачи аргументов из других записей FROM -clause.

...