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.