Возврат всех записей через табличную функцию при пропуске параметра NULL - PullRequest
1 голос
/ 17 февраля 2020
CREATE FUNCTION [dbo].[fn_actions]
(
  @roleid varchar(36)
)
RETURNS TABLE
AS
RETURN
  select *
  from actions 
  where action_type_id in (
    select action_type_id
    from action_roles
    where role_id = isnull(@roleid,role_id)
  )

Вышеприведенная функция возвращает список действий из таблицы actions_roles, который соответствует предоставленному параметру @roleid. Однако в таблице действий есть некоторые действия, которых вообще нет в таблице action_roles. Поэтому, когда указан параметр NULL, я бы хотел, чтобы функция просто возвращала

select * from actions

Я пытался использовать оператор if, но это не работает для встроенной таблицы functions.

CREATE FUNCTION [dbo].[fn_actions]
(
  @roleid varchar(36)
)
RETURNS TABLE
AS
RETURN
  IF (@roleid is NULL)
  BEGIN
    select * from actions
  END
  ELSE
    select *
    from actions 
    where action_type_id in (
      select action_type_id
      from action_roles
      where role_id = isnull(@roleid,role_id)
    )

Каков наилучший способ добиться этого?

1 Ответ

2 голосов
/ 17 февраля 2020

Вы можете просто перенести проверку недействительности параметра на внешний запрос.

Это должно делать то, что вы хотите, упрощая запрос и, возможно, делая его более эффективным (это дает изменение в планировщике запросов, чтобы он не выполнял подзапрос при нулевом параметре).

select * 
from actions 
where 
    @roleid is null
    or action_type_id in (select action_type_id from action_roles)

Примечание: как прокомментировал Владимир Баранов, вам, вероятно, следует добавить option(recompile) к этому запросу (он идет в самом конце), чтобы заставить базу данных пересчитывать план запроса для каждого выполнения, чтобы она могла оптимизировать подзапрос отсутствует, когда параметр имеет значение null.

...