Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Предавайте тип стойност на таблица към съхранена процедура на SQL Server чрез Entity Framework

Да приемем, че искате да изпратите таблица с една колона от GUID.

Първо трябва да създадем структура, използвайки SqlMetaData който представлява схемата на таблицата (колони).

Кодът по-долу демонстрира, че една колона с име „Id“ на GUID е тип таблица с параметри на SQL съхранена процедура

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

След това създавате списък със записи, които съответстват на схемата, като използвате SqlDataRecord .

Кодът по-долу демонстрира как да добавите елементи в списък, като използвате създадената по-горе схема. Създайте нов SqlDataRecord за всеки от елементите в списъка. Заменете SetGuid със съответния тип и заменете Guid.NewGuid() като съответната стойност. Повторете нов SqlDataRecord за всеки елемент и ги добавете към списък

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

След това създайте 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
};

След това просто извикайте съхранената процедура, като използвате база данни .SqlQuery .

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

В SQL Server създайте своя дефиниран от потребителя тип таблица (аз добавям суфикс към тях с TTV, стойност на въведена таблица):

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

След това посочете типа като параметър (не забравяйте, че стойностите на типа таблица трябва да са само за четене!):

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. Какъв е обхватът на CONTEXT_INFO в SQL Server?

  2. Задайте съпоставяне на база данни в Entity Framework Code-First Initializer

  3. Използвайки SMO, все още не върви... ConnectionContext.ExecuteNonQuery(script) не може да разбере GO

  4. Как да се присъединя към първия ред

  5. tsql последно срещане на вътре в низ