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.