sql >> Database >  >> RDS >> Sqlserver

C# &SQL Server - de beste manier om meerdere rijen in één keer te verwijderen met behulp van een opgeslagen procedure

U kunt hiervoor tabelparameters gebruiken. De applicatielaag zou er ongeveer zo uitzien

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

Deze aanpak heeft een aantal voordelen ten opzichte van het bouwen van strings

  • U vermijdt het maken van query's in de applicatielaag, waardoor een scheiding van zorgen ontstaat
  • U kunt gemakkelijker uitvoeringsplannen testen en zoekopdrachten optimaliseren
  • U bent minder kwetsbaar voor SQL-injectie-aanvallen, omdat uw gegeven aanpak geen geparamatiseerde query zou kunnen gebruiken om de IN-clausule te bouwen
  • De code is beter leesbaar en illustratiever
  • Je bouwt uiteindelijk geen extreem lange strings

Prestaties

Er zijn enkele overwegingen over de prestaties van TVP's op grote datasets.

Omdat TVP's variabelen zijn, stellen ze geen statistieken op. Dit betekent dat de query-optimizer het uitvoeringsplan soms kan verknoeien. Als dit gebeurt, zijn er een paar opties:

  • stel OPTION (RECOMPILE) op TVP-verklaringen waar indexering een probleem is
  • schrijf de TVP in een lokale temp en stel daar de indexering in

Hier is een geweldig artikel over TVP's met een goed gedeelte over prestatieoverwegingen en wat u wanneer kunt verwachten.

Dus als u zich zorgen maakt over het bereiken van limieten voor stringparameters, zijn de tabelparameters misschien de juiste keuze. Maar uiteindelijk is het moeilijk te zeggen zonder meer te weten over de dataset waarmee je werkt.



  1. postgresql des encrypt

  2. SQLPlus-instellingen om een ​​door tabs gescheiden gegevensbestand te genereren

  3. CSV-bestand importeren in een Oracle Forms-toepassing

  4. Kan object niet neerzetten omdat ernaar wordt verwezen door een FOREIGN KEY-beperking - SQL Server / TSQL-zelfstudie, deel 74