sql >> Database >  >> RDS >> Sqlserver

Geef het type tabelwaarde door aan de opgeslagen procedure van SQL Server via Entity Framework

Stel dat u een tabel wilt verzenden met een enkele kolom met GUID's.

Eerst moeten we een structuur maken met behulp van SqlMetaData die het schema van de tabel (kolommen) vertegenwoordigt.

De onderstaande code demonstreert een kolom met de naam "Id" van de GUID is het parametertabeltype van de opgeslagen SQL-procedure

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

Vervolgens maakt u een lijst met records die overeenkomen met het schema met behulp van SqlDataRecord .

De onderstaande code laat zien hoe u de items in een lijst kunt toevoegen met behulp van het hierboven gemaakte schema. Maak een nieuw SqlDataRecord voor elk van de items in de lijst. Vervang SetGuid door het corresponderende type en vervang Guid.NewGuid() als de corresponderende waarde.Herhaal nieuwe SqlDataRecord voor elk item en voeg ze toe aan een lijst

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

Maak vervolgens de 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
};

Roep vervolgens de opgeslagen procedure aan met behulp van de Database .SqlQuery .

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

Maak in SQL Server uw door de gebruiker gedefinieerde tabeltype (ik voeg ze toe met TTV, Table Typed Value):

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

Specificeer vervolgens het type als een parameter (vergeet niet dat Tabeltypewaarden alleen-lezen moeten zijn!):

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. Mysql - Hoe bestel ik resultaten door afwisselende (1,2,3, 1, 2, 3, 1, 2, 3,) rijen, is dat mogelijk?

  2. Bereken het percentage van de wortel dat eigendom is van de ouders

  3. Versleutel de gegevens in postgresql

  4. Docker-compose gebruiken om tabellen te maken in de postgresql-database