sql >> Base de Datos >  >> RDS >> Sqlserver

Pase el tipo de valor de la tabla al procedimiento almacenado de SQL Server a través de Entity Framework

Digamos que desea enviar una tabla con una sola columna de GUID.

Primero necesitamos crear una estructura usando SqlMetaData que representa el esquema de la tabla (columnas).

El siguiente código demuestra que una columna denominada "Id" del GUID es el tipo de tabla de parámetros del procedimiento almacenado de SQL

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

A continuación, cree una lista de registros que coincidan con el esquema usando SqlDataRecord .

El siguiente código muestra cómo agregar los elementos dentro de una lista utilizando el esquema creado anteriormente. Cree un nuevo SqlDataRecord para cada uno de los elementos de la lista. Reemplace SetGuid con el tipo correspondiente y Reemplace Guid.NewGuid() como el valor correspondiente. Repita el nuevo SqlDataRecord para cada elemento y agréguelos a una Lista

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

Luego cree el 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
};

Luego simplemente llame al procedimiento almacenado usando la Base de datos .SqlQuery .

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

En SQL Server, cree su tipo de tabla definida por el usuario (les sufijo TTV, valor de tipo de tabla):

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

A continuación, especifique el tipo como parámetro (¡no olvide que los valores de tipo de tabla deben ser de solo lectura!):

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