sql >> Databáze >  >> RDS >> Sqlserver

Předejte typ hodnoty tabulky uložené proceduře serveru SQL Server prostřednictvím Entity Framework

Řekněme, že chcete odeslat tabulku s jedním sloupcem GUID.

Nejprve musíme vytvořit strukturu pomocí SqlMetaData který představuje schéma tabulky (sloupců).

Níže uvedený kód ukazuje, že jeden sloupec s názvem "Id" GUID je typ tabulky parametrů uložené procedury SQL

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

Dále vytvoříte seznam záznamů, které odpovídají schématu pomocí SqlDataRecord .

Níže uvedený kód ukazuje, jak přidat položky do seznamu pomocí výše vytvořeného schématu. Vytvořte nový záznam SqlDataRecord pro každou z položek v seznamu. Nahraďte SetGuid odpovídajícím typem a Replace Guid.NewGuid() jako odpovídající hodnotu. Opakujte nový SqlDataRecord pro každou položku a přidejte je do seznamu

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

Poté vytvořte 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
};

Poté jednoduše zavolejte uloženou proceduru pomocí databáze .SqlQuery .

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

V SQL Server vytvořte svůj uživatelsky definovaný typ tabulky (připojuji je TTV, hodnota zadaná tabulkou):

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

Poté zadejte typ jako parametr (nezapomeňte, že hodnoty typu tabulky musí být pouze pro čtení!):

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. Uzamkněte tabulku mysql pomocí php

  2. Jak změnit hodnotu automatického přírůstku databáze MySQL / MariaDB

  3. Django, mod_wsgi, psycopg2 Nesprávně nakonfigurováno:Chyba při načítání modulu psycopg2:Žádný modul s názvem _psycopg

  4. Mysql měsíc - rok srovnání