Sql server SQL Server 2017表值函数-使用多个值而不是一个值进行筛选

Sql server SQL Server 2017表值函数-使用多个值而不是一个值进行筛选,sql-server,sql-server-2017,Sql Server,Sql Server 2017,我使用的是SQL Server 2017,版本14.0.2002.14(开发者版(64位)) 我正在尝试创建一个函数,用户可以在其中传递多个值来过滤查询 我通常可以使用以下模板使用只要求一个参数的函数来完成此操作: CREATE FUNCTION func_1 ( @StartDate date, @EndDate date ) RETURNS TABLE AS RETURN ( SELECT * FROM table_name WHERE table_name.Date BETWEEN

我使用的是SQL Server 2017,版本
14.0.2002.14
(开发者版(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
)
用户可以通过执行以下操作返回筛选结果:

从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,即该函数的预期用途是基于多个参数进行过滤

我做了类似的操作。您必须创建一个表类型,它将是一个字符串列表。例如:

CREATE TYPE FilterType AS TABLE (MyFilter VARCHAR(10))
然后,您可以在存储过程中指定此参数(对于函数bug不可用,我认为它将在存储过程中实现您想要的功能)

一旦进入您的程序,您就可以将其用作表格

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

这样做的好处是,您可以根据需要定义类型,并向其中添加所需的参数。

以下链接中的内容与您想要实现的功能相同,但只针对一个参数

访问函数时,请使用以下命令:

SELECT 
  product_name,
  list_price
FROM 
  udfProductInYear(2018);

您想向函数而不是表变量传递任意数量的参数吗?简短回答-不,您不能这样做。函数具有固定数量的参数。也不能将值的“数组”作为使用TVP的惰性形式传递,但对于表类型,可以将值的“数组”作为参数传递
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);