Какой самый простой способ передать массив значений в параметр TVF? - PullRequest
2 голосов
/ 15 мая 2019

Цель:

Я бы хотел, чтобы в моей функции был параметр, позволяющий пользователю вводить список значений.В идеале самое простое решение ... Примечание: у меня нет прав для создания таблиц в 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])

Ответы [ 2 ]

5 голосов
/ 15 мая 2019

Используя параметр типа таблицы, вы можете сделать что-то вроде следующего:

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)
1 голос
/ 16 мая 2019

Если вы используете 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
...