【问题标题】:What is the simplest way to put pass an array of values into a parameter of TVF将值数组传递给TVF参数的最简单方法是什么
【发布时间】:2019-10-02 18:06:07
【问题描述】:

目标:

我想在我的函数中有一个参数,以允许用户输入值列表。理想情况下,最简单的解决方案...注意:我没有权限在 dbs 中创建表。

情况:

CREATE FUNCTION dbo.fnExample
(
    @StartDate AS Date -- Parameter 1
    @ParameterArray AS ... -- This would be the parameter that accepts a list of values
)
RETURNS TABLE
AS
RETURN
...code...
GO

不确定如何在 TVF 中传递多个参数,但这是我查看解决方案的方式

SELECT *
FROM dbo.fnExample ('2019-01-01') and ([list of values])

【问题讨论】:

  • 使用表类型参数。
  • 如果您没有权限为 TVP 创建必要的类型,here 是对替代方案的更广泛讨论。
  • 您没有创建表的权限,但可以创建函数?
  • 好吧,试着运行 larnu 的答案。如果你得到一个结果而不是错误,那么你就有了答案。如果你得到一个权限错误,那么是时候回到绘图板了。
  • 能够创建函数但不能创建表是合乎逻辑的。函数是代码,但表需要规划存储和适当的设计,一些 DBA 可能希望更仔细地控制。

标签: sql arrays sql-server parameters user-defined-functions


【解决方案1】:

使用表类型参数,您可以执行以下操作:

CREATE TYPE dbo.SomeArray AS TABLE (SomeInt int); --Create the TYPE
GO
 --Now the Function
CREATE FUNCTION dbo.Example (@StartDate date, @Array dbo.SomeArray READONLY)
RETURNS TABLE
AS RETURN

    SELECT DATEADD(DAY, SomeInt, @StartDate) AS NewDate
    FROM @Array

GO

--Now to test
--Declare the TYPE
DECLARE @Array dbo.SomeArray;
--Insert the data
INSERT INTO @Array (SomeInt)
VALUES(7),(1654),(13);

--Test the function
SELECT *
FROM dbo.Example(GETDATE(), @Array) E;
GO

--Clean up
DROP FUNCTION dbo.Example;
DROP TYPE dbo.SomeArray;

如何JOIN:

FROM dbo.YourTable YT
     JOIN @Array A ON YT.SomeInt = A.SomeInt

EXISTS的使用方法:

WHERE EXISTS (SELECT 1 FROM @Array A WHERE YT.SomeInt = A.SomeInt)

【讨论】:

  • 为什么在你把 FROM @Array.我将整个查询放在哪里?
  • 这是@RogerSteinberg 的示例,我无法告诉您如何编写查询,因为您已将其替换为...code...。我无法重写我无权访问的东西。 :) 您必须填写有关如何在查询中使用 Table-Type 参数的空白。
  • 所以假设 '@'Array 是一个 ids 列表。我可以在 where 语句中传递 '@'Array 吗?
  • 您需要使用JOINEXISTS。这不是一个列表,而是一个表格。
  • 如果你能提供关于 cmets 的小提琴,我会很乐意稍后看看。
【解决方案2】:

如果您使用的是 SQL Server 2016+,最简单的方法是使用 JSON:

CREATE FUNCTION dbo.fnExample
(
    @StartDate AS Date -- Parameter 1
    @ParameterArray AS NVARCHAR(MAX) -- pass JSON Array like '[1,2,3,4,5]'
)
RETURNS TABLE
AS
RETURN
SELECT TRY_CONVERT(INT,j.value) AS [ID] FROM OPENJSON(@ParameterArray) j;
GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2019-04-22
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多