Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

C # &SQL Server - meilleur moyen de supprimer plusieurs lignes en une seule fois à l'aide d'une procédure stockée

Vous pouvez utiliser des paramètres de table pour transmettre cela. La couche d'application ressemblerait à quelque chose comme

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

Cette approche présente un certain nombre d'avantages par rapport à la création de chaînes

  • Vous évitez de créer des requêtes dans la couche d'application, ce qui crée une séparation des problèmes
  • Vous pouvez tester plus facilement les plans d'exécution et optimiser les requêtes
  • Vous êtes moins vulnérable aux attaques par injection SQL, car votre approche ne serait pas en mesure d'utiliser une requête paramétrée pour créer la clause IN
  • Le code est plus lisible et illustratif
  • Vous ne finissez pas par créer des chaînes excessivement longues

Performance

Il existe certaines considérations concernant les performances des TVP sur de grands ensembles de données.

Parce que les TVP sont des variables, ils ne compilent pas de statistiques. Cela signifie que l'optimiseur de requête peut parfois truquer le plan d'exécution. Si cela se produit, il y a quelques options :

  • définir OPTION (RECOMPILE) sur toutes les déclarations TVP où l'indexation est un problème
  • écrire le TVP dans un temp local et y configurer l'indexation

Voici un excellent article sur les TVP avec une bonne section sur les considérations de performance, et à quoi s'attendre quand.

Donc, si vous craignez d'atteindre les limites des paramètres de chaîne, les paramètres de table peuvent être la solution. Mais au final, il est difficile de dire sans en savoir plus sur l'ensemble de données avec lequel vous travaillez.