Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Lewati jenis nilai tabel ke prosedur tersimpan SQL Server melalui Entity Framework

Katakanlah Anda ingin mengirim tabel dengan satu kolom GUID.

Pertama kita perlu membuat struktur menggunakan SqlMetaData yang mewakili skema tabel (kolom).

Kode di bawah ini menunjukkan satu kolom bernama "Id" dari GUID adalah tipe tabel parameter prosedur tersimpan SQL

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

Selanjutnya Anda membuat daftar catatan yang cocok dengan skema menggunakan SqlDataRecord .

Kode di bawah ini menunjukkan cara menambahkan item di dalam daftar menggunakan skema yang dibuat di atas. Buat SqlDataRecord baru untuk setiap item dalam daftar. Ganti SetGuid dengan jenis yang sesuai dan Ganti Guid.NewGuid() sebagai nilai yang sesuai.Ulangi SqlDataRecord baru untuk setiap item dan tambahkan ke Daftar

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

Kemudian buat 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
};

Kemudian cukup panggil prosedur tersimpan dengan menggunakan Database .SqlQuery .

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

Di SQL Server, buat Jenis Tabel Buatan Pengguna Anda (saya akhiri dengan TTV, Nilai Ketik Tabel):

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

Kemudian tentukan jenisnya sebagai parameter (jangan lupa, Nilai Jenis Tabel harus readonly!):

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. Berapa nomor telepon dunia terpanjang yang harus saya pertimbangkan dalam SQL varchar(panjang) untuk telepon

  2. Batasan yang hanya memungkinkan satu dari dua tabel untuk mereferensikan tabel dasar

  3. tumpukan SQL Server vs. indeks berkerumun

  4. Bagaimana cara mengubah SQL Server 2005 menjadi case sensitive?

  5. Sisipan massal lambat untuk tabel dengan banyak indeks