sql >> Database teknologi >  >> RDS >> Sqlserver

C# &SQL Server - bedste måde at slette flere rækker på én gang ved hjælp af en lagret procedure

Du kan bruge tabelværdiparametre til at give dette. Applikationslaget ville ligne

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

Der er en række fordele ved denne tilgang i forhold til at bygge strenge

  • Du undgår at oprette forespørgsler i applikationslaget, hvilket skaber en adskillelse af bekymringer
  • Du kan nemmere teste eksekveringsplaner og optimere forespørgsler
  • Du er mindre sårbar over for SQL-injektionsangreb, da din givne tilgang ikke ville være i stand til at bruge en paramatiseret forespørgsel til at bygge IN-klausulen
  • Koden er mere læsbar og illustrativ
  • Du ender ikke med at bygge alt for lange strenge

Ydeevne

Der er nogle overvejelser om TVP'ers ydeevne på store datasæt.

Fordi TVP'er er variable, kompilerer de ikke statistik. Dette betyder, at forespørgselsoptimeringsværktøjet nogle gange kan fudge eksekveringsplanen. Hvis dette sker, er der et par muligheder:

  • indstil OPTION (RECOMPILE) på alle TVP-udsagn, hvor indeksering er et problem
  • skriv TVP'en til en lokal vikar og opsæt indekseringen der

Her er en fantastisk artikel om TVP'er med et godt afsnit om præstationshensyn, og hvad man kan forvente hvornår.

Så hvis du er bekymret for at ramme grænser for strengparametre, kan de tabelværdisatte parametre være vejen at gå. Men i sidste ende er det svært at sige uden at vide mere om det datasæt, du arbejder med.



  1. MySQL-forespørgsel i Code Igniter Active Directory-format?

  2. Hvordan OPDATERE en kolonne ved hjælp af en anden kolonne i en anden tabel? SQL-fejl:ORA-00933:SQL-kommando blev ikke afsluttet korrekt

  3. Overvågning af Percona Server til MySQL - Key Metrics

  4. Hvor skal man bruge Outer Apply