sql >> Database teknologi >  >> RDS >> Sqlserver

Send tabelværditype til SQL Server-lagret procedure via Entity Framework

Lad os sige, at du vil sende en tabel med en enkelt kolonne af GUID'er.

Først skal vi oprette en struktur ved hjælp af SqlMetaData som repræsenterer tabellens skema (kolonner).

Nedenstående kode viser, at en kolonne med navnet "Id" af GUID'en er den parametertabeltype for SQL-lagrede procedure

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

Dernæst opretter du en liste over poster, der matcher skemaet ved hjælp af SqlDataRecord .

Nedenstående kode viser, hvordan man tilføjer elementerne i en liste ved hjælp af det ovenfor oprettede skema. Opret en ny SqlDataRecord for hvert af elementerne på listen. Erstat SetGuid med den tilsvarende type og Erstat Guid.NewGuid() som den tilsvarende værdi. Gentag ny SqlDataRecord for hvert element, og føj dem til en liste

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

Opret derefter 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
};

Kald derefter blot den lagrede procedure ved at bruge 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
{

I SQL Server skal du oprette din brugerdefinerede tabeltype (jeg suffixer dem med TTV, tabeltypeværdi):

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

Angiv derefter typen som en parameter (glem ikke, tabeltypeværdier skal være skrivebeskyttet!):

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. Skift kolonneværdi med den samme kolonne i en anden post

  2. Sådan kortlægger du et PostgreSQL-array med Hibernate

  3. Er der nogen forskel mellem DATE_SUB() og at bruge aritmetiske operatorer til beregning af dato og klokkeslæt?

  4. Indsæt Ignorer - er der en måde at vide, om sætningen blev ignoreret? MYSQL