Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Przekaż typ wartości tabeli do procedury składowanej programu SQL Server za pośrednictwem Entity Framework

Powiedzmy, że chcesz wysłać tabelę z pojedynczą kolumną identyfikatorów GUID.

Najpierw musimy stworzyć strukturę za pomocą SqlMetaData który reprezentuje schemat tabeli (kolumny).

Poniższy kod pokazuje, że jedna kolumna o nazwie „Id” identyfikatora GUID jest typem tabeli parametrów procedury składowanej SQL

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

Następnie utwórz listę rekordów zgodnych ze schematem przy użyciu SqlDataRecord .

Poniższy kod pokazuje, jak dodać elementy do listy przy użyciu utworzonego powyżej schematu. Utwórz nowy SqlDataRecord dla każdego elementu na liście. Zastąp SetGuid odpowiednim typem i Zastąp Guid.NewGuid() jako odpowiednią wartość.Powtórz nowy rekord SqlDataRecord dla każdego elementu i dodaj je do listy

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

Następnie utwórz 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
};

Następnie po prostu wywołaj procedurę składowaną przy użyciu bazy danych .SqlQuery .

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

W SQL Server utwórz typ tabeli zdefiniowanej przez użytkownika (dodałem do nich TTV, wartość wpisana w tabelę):

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

Następnie określ typ jako parametr (nie zapomnij, wartości typu tabeli muszą być tylko do odczytu!):

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć tabelę w schemacie SYS w SQL Server?

  2. Przykład z życia, kiedy używać OUTER / CROSS APPLY w SQL

  3. Ograniczenia SQL Server Express

  4. Wybierz wartość, jeśli warunek w SQL Server

  5. Instalacja SQL Server 2017