sql >> Databasteknik >  >> RDS >> Sqlserver

Skicka tabellvärdestyp till SQL Server-lagrad procedur via Entity Framework

Låt säga att du vill skicka en tabell med en enda kolumn med GUID.

Först måste vi skapa en struktur med SqlMetaData som representerar tabellens schema (kolumner).

Koden nedan visar att en kolumn med namnet "Id" i GUID är parametertabelltypen för den lagrade SQL-proceduren

var tableSchema = new List<SqlMetaData>(1)
{
  new SqlMetaData("Id", SqlDbType.UniqueIdentifier)
}.ToArray();

Därefter skapar du en lista över poster som matchar schemat med SqlDataRecord .

Koden nedan visar hur man lägger till objekten i en lista med det ovan skapade schemat. Skapa ett nytt SqlDataRecord för vart och ett av objekten i listan. Ersätt SetGuid med motsvarande typ och Ersätt Guid.NewGuid() som motsvarande värde. Upprepa nytt SqlDataRecord för varje objekt och lägg till dem i en lista

var tableRow = new SqlDataRecord(tableSchema);
tableRow.SetGuid(0, Guid.NewGuid());
var table = new List<SqlDataRecord>(1)
{
  tableRow
};

Skapa sedan SqlParameter :

var parameter = new SqlParameter();
parameter.SqlDbType = SqlDbType.Structured;
parameter.ParameterName = "@UserIds"; //@UserIds is the stored procedure parameter name
parameter.TypeName = "{Your stored procedure type name}"
parameter.Value = table;

var parameters = new SqlParameter[1]
{
  parameter
};

Anropa sedan helt enkelt den lagrade proceduren genom att använda databasen .SqlQuery .

IEnumerable<ReturnType> result;
using (var myContext = new DbContext())
{
  result = myContext.Database.SqlQuery<User>("GetUsers @UserIds", parameters)
    .ToList();         // calls the stored procedure
    // ToListAsync();  // Async
{

Skapa din användardefinierade tabelltyp i SQL Server (jag suffixar dem med TTV, Tabelltypat värde):

CREATE TYPE [dbo].[UniqueidentifiersTTV] AS TABLE(
  [Id] [uniqueidentifier] NOT NULL
)
GO

Ange sedan typen som en parameter (glöm inte, tabelltypsvärden måste vara skrivskyddade!):

CREATE PROCEDURE [dbo].[GetUsers] (
  @UserIds [UniqueidentifiersTTV] READONLY
) AS
BEGIN
  SET NOCOUNT ON

  SELECT u.* -- Just an example :P
  FROM [dbo].[Users] u
  INNER JOIN @UserIds ids On u.Id = ids.Id
END


  1. Hur man använder Coalesce Function i Oracle

  2. Vad är betydelsen av 1/1/1753 i SQL Server?

  3. Hämta senast infogade ID-formulär lagrad procedur i MySQL

  4. Uttryck en CTE med Arel