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

C# i SQL Server - najlepszy sposób na usunięcie wielu wierszy za jednym razem przy użyciu procedury składowanej

Możesz użyć parametrów o wartościach tabeli, aby to przekazać. Warstwa aplikacji wyglądałaby mniej więcej tak:

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

Takie podejście ma wiele zalet w porównaniu z budowaniem ciągów

  • Unikasz tworzenia zapytań w warstwie aplikacji, tworząc separację wątpliwości
  • Możesz łatwiej testować plany wykonania i optymalizować zapytania
  • Jesteś mniej podatny na ataki typu SQL injection, ponieważ twoje podejście nie byłoby w stanie użyć sparametryzowanego zapytania do zbudowania klauzuli IN
  • Kod jest bardziej czytelny i ilustracyjny
  • Nie kończysz na budowaniu zbyt długich ciągów

Wydajność

Istnieją pewne rozważania dotyczące wydajności TVP na dużych zbiorach danych.

Ponieważ TVP są zmiennymi, nie tworzą statystyk. Oznacza to, że optymalizator zapytań może czasami fałszować plan wykonania. Jeśli tak się stanie, istnieje kilka opcji:

  • ustaw OPTION (RECOMPILE) na wszelkich wypowiedziach TVP, w których indeksowanie jest problemem
  • zapisz TVP do lokalnego temp. i tam skonfiguruj indeksowanie

Oto świetny artykuł w TVP z dobrą sekcją dotyczącą kwestii wydajności i tego, czego się spodziewać, kiedy.

Jeśli więc martwisz się przekroczeniem limitów parametrów łańcuchowych, dobrym rozwiązaniem mogą być parametry o wartościach w tabeli. Ale ostatecznie trudno powiedzieć, nie wiedząc więcej o zestawie danych, z którym pracujesz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bardzo duże tabele w SQL Server

  2. Pobierz sumę kolumny w ostatnim wierszu, dobra praktyka?

  3. Codeigniter:Jak skonfigurować połączenie z serwerem SQL (2008)

  4. Jak naprawić konflikt sortowania w zapytaniu SQL Server?

  5. Dylemat nazewnictwa tabel:nazwy w liczbie pojedynczej i mnogiej