web-dev-qa-db-ja.com

(インライン)ユーザー定義関数のパラメーターとして整数の配列を渡す(SQL Server)

TBV機能があります。このような

ALTER FUNCTION [dbo].[fn_Functiont]
(
 @accessibleIds   ListAccesableIds READONLY
)
RETURNS TABLE 
AS
RETURN 
(   
SELECT d.*, b.Name AS Name, ps.Name AS PaymentSystemName, c.UserName AS UserName, c.FirstName AS ClientFirstName, c.LastName AS LastName, c.Number AS DocumentNumber, c.Id
FROM Document AS d
JOIN System AS ps ON d.SystemId = ps.Id
JOIN Client AS c ON c.Id = d.ClientId
LEFT JOIN Shop AS b ON b.Id = d.ShopId
WHERE d.OperationTypeId IN (2, 4, 5) AND c.Type = 1
)

この関数に整数を含むリストを渡したいと思います。テーブル値型を作成するのは難しかったのですが、リスト入力パラメーターを関数に渡すにはどうすればよいですか?ADO.Netを介してリストをSPとても簡単ですが、私の問題はEntity FrameworkとTBF関数に関するものです

Entity Framework 6を​​介してこの関数を呼び出し、私たちが使用したアプローチは最初にデータベースでした。

3
So_oP

SQL-Server 2014では、 [〜#〜] type [〜#〜] (エイリアスデータ型)を活用して、整数の配列をシミュレートするインラインUDFのパラメーターとして渡すことができます。またはその他の表形式のデータ。

READONLYを使用する必要があることに注意してください。

IF OBJECT_ID('dbo.MyTest') IS NOT NULL
    DROP TABLE dbo.MyTest;
GO

IF OBJECT_ID('dbo.MyFunction') IS NOT NULL
    DROP FUNCTION dbo.MyFunction;
GO

IF TYPE_ID ('dbo.Mytype') IS NOT NULL
    DROP TYPE dbo.Mytype;
GO

CREATE TYPE dbo.Mytype AS TABLE (Id int);
GO

CREATE TABLE dbo.MyTest (Id int, Val char(3));
INSERT INTO dbo.MyTest VALUES (1,'V1'),(2,'V2'),(10,'V10'),(11,'V11');
GO

CREATE FUNCTION dbo.MyFunction(@Table MyType READONLY)
RETURNS TABLE
AS
RETURN
(
    SELECT *
    FROM   MyTest
    WHERE  Id IN (SELECT Id FROM @Table)
);
GO
DECLARE @myTable Mytype;
INSERT INTO @myTable(Id) VALUES(1),(2),(3),(4),(5);

SELECT * FROM MyFunction(@myTable);

| Id | Status |
|:--:|:------:|
|  1 |   V1   |
|  2 |   V2   |

dbfiddle ここ

6
McNets