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.