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

C# &SQL Server - cara terbaik untuk menghapus beberapa Baris sekaligus menggunakan prosedur tersimpan

Anda bisa menggunakan parameter bernilai tabel untuk menyerahkan ini. Lapisan aplikasi akan terlihat seperti

C#

var tvp = new DataTable();
tvp.Columns.Add("Id", typeof(int));

foreach(var id in RecIdsToDelete)
    tvp.Rows.Add(new {id});

var connection = new SqlConnection("your connection string");

var delete = new SqlCommand("your stored procedure name", connection)
{
  CommandType = CommandType.StoredProcedure
};

delete
  .Parameters
  .AddWithValue("@ids", tvp)
  .SqlDbType = SqlDbType.Structured;

delete.ExecuteNonQuery();

SQL

IF NOT EXISTS(SELECT * FROM sys.table_types WHERE name = 'IDList')
BEGIN
    CREATE TYPE IDList AS TABLE(ID INTEGER)
END


CREATE PROCEDURE School.GroupStudentDelete
(                                         
        @IDS IDLIST READONLY      
)                                         
AS

SET NOCOUNT ON;

BEGIN TRY
        BEGIN TRANSACTION

        DECLARE @Results TABLE(id INTEGER)

        DELETE 
        FROM TblName 
        WHERE Id IN (SELECT ID FROM @IDS)        

        COMMIT TRANSACTION
END TRY
BEGIN CATCH
        PRINT ERROR_MESSAGE();

        ROLLBACK TRANSACTION
        THROW; -- Rethrow exception
END CATCH
GO

Ada sejumlah keuntungan dari pendekatan ini dibandingkan membangun string

  • Anda menghindari membuat kueri di lapisan aplikasi, membuat pemisahan masalah
  • Anda dapat dengan lebih mudah menguji rencana eksekusi dan mengoptimalkan kueri
  • Anda kurang rentan terhadap serangan injeksi SQL, karena pendekatan yang Anda berikan tidak akan dapat menggunakan kueri paramater untuk membangun klausa IN
  • Kode ini lebih mudah dibaca dan ilustratif
  • Anda tidak akan membuat string yang terlalu panjang

Kinerja

Ada beberapa pertimbangan tentang kinerja TVP pada kumpulan data besar.

Karena TVP adalah variabel, mereka tidak mengkompilasi statistik. Ini berarti pengoptimal kueri terkadang dapat memalsukan rencana eksekusi. Jika ini terjadi, ada beberapa opsi :

  • setel OPTION (RECOMPILE) pada pernyataan TVP mana pun di mana pengindeksan menjadi masalah
  • tulis TVP ke temp lokal dan atur pengindeksan di sana

Berikut ini artikel bagus tentang TVP dengan bagian yang bagus tentang pertimbangan kinerja, dan apa yang diharapkan kapan.

Jadi, jika Anda khawatir tentang mencapai batas pada parameter string, parameter yang dinilai tabel mungkin merupakan cara yang tepat. Tetapi pada akhirnya, sulit untuk mengatakan tanpa mengetahui lebih banyak tentang kumpulan data yang sedang Anda kerjakan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konversi 'datetime' menjadi 'datetimeoffset' di SQL Server (Contoh T-SQL)

  2. Cara meringkas bidang waktu di SQL Server

  3. Masukkan nilai string hex ke bidang gambar server sql menambahkan ekstra 0

  4. Solusi untuk dukungan kursor bukanlah fitur yang diterapkan untuk kesalahan TDS SQL Server Parallel DataWarehousing

  5. Agregat Fungsi SQL untuk mengambil hanya yang pertama dari setiap grup