Табличные функции SQL Server 2017 - фильтрация по нескольким значениям вместо одного - PullRequest
1 голос
/ 09 октября 2019

Я использую SQL Server 2017, версия 14.0.2002.14 (Developer Edition (64-разрядная версия))

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

Обычно я могу сделать это с функциями, которые запрашивают только один параметр, используя шаблон ниже:

CREATE FUNCTION func_1
(
@StartDate date,
@EndDate date
)
RETURNS TABLE AS 
RETURN
(
SELECT * FROM table_name 
WHERE  table_name.Date BETWEEN @StartDate and @EndDate
)

Пользователь сможет вернуть отфильтрованные результаты, выполнив:

SELECT * FROM func_1('20190101', '20191231')


При попытке вернуть результаты путем передачи нескольких значений этот запрос работает при выполнении на SQL Server:

-- Declare a TABLE variable to be used as a filter
DECLARE @Product TABLE
(
   Products varchar(10)
)
INSERT INTO @Product VALUES('value_1', 'value_2')

-- Return filtered results from query
SELECT Date, Product, Quantity
FROM   Table_Name
WHERE  Table_Name.Product IS IN (SELECT Products FROM @Product)

Однако мне бы хотелосьчтобы создать его как функцию, которая не нравится SQL Server ...

CREATE FUNCTION func_2
(
    @StartDate date,
    @EndDate date,
    @Product TABLE
    (
    Product varchar(10)
    )
    INSERT INTO @Product VALUES()
)
RETURNS TABLE AS
RETURN
(
SELECT Date, Product, Quantity
FROM   Table_Name
WHERE  Date BETWEEN @StartDate AND @EndDate
AND    Table_Name.Product IS IN (SELECT Products FROM @Product)
)

Пользователь должен вызвать этот запрос и вернуть ему отфильтрованные результаты:

SELECT * FROM func_2('20190101', '20191231', ('value_1', 'value_2', 'value_3'))

Редактировать:Также добавлены аргументы даты в func_2, т.е. функция предназначена для фильтрации по более чем одному параметру

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Я сделал нечто подобное. Вы должны создать табличный тип, который будет списком строк. Например:

CREATE TYPE FilterType AS TABLE (MyFilter VARCHAR(10))

Затем вы можете указать этот параметр в хранимом процессе (ошибка недоступна для функций. Я думаю, что он все равно будет делать то, что вы хотите с сохраненным процессом).

CREATE PROCEDURE MyProc (@filters FilterType  READONLY, ...)

Оказавшись внутри своей процедуры, вы можете использовать ее в качестве таблицы

SELECT * FROM YourTable t join @filters f on f.MyFilter = t.Column

Что приятно, так это то, что вы можете определить ТИП по своему усмотрению и добавить столько параметров, сколько вам нужно.

0 голосов
/ 09 октября 2019

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

пользовательские функции sql-сервера

CREATE FUNCTION udfProductInYear (
@model_year INT
   )
RETURNS TABLE
AS
RETURN
   SELECT 
      product_name,
      model_year,
      list_price
  FROM
     production.products
  WHERE
    model_year = @model_year;

При доступе к вашей функции используйте следующее:

SELECT 
  product_name,
  list_price
FROM 
  udfProductInYear(2018);
...