Puede usar parámetros con valores de tabla para entregar esto. La capa de aplicación se parecería a
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();
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
Hay una serie de ventajas en este enfoque sobre la construcción de cadenas
- Evitas crear consultas en la capa de aplicación, creando una separación de preocupaciones
- Puede probar más fácilmente los planes de ejecución y optimizar las consultas
- Es menos vulnerable a los ataques de inyección SQL, ya que su enfoque dado no podría usar una consulta parametrizada para construir la cláusula IN
- El código es más legible e ilustrativo
- No terminas construyendo cadenas excesivamente largas
Rendimiento
Existen algunas consideraciones sobre el rendimiento de los TVP en grandes conjuntos de datos.
Debido a que los TVP son variables, no compilan estadísticas. Esto significa que el optimizador de consultas puede modificar el plan de ejecución a veces. Si esto sucede, hay un par de opciones:
- establecer
OPTION (RECOMPILE)
en cualquier declaración de TVP donde la indexación es un problema - escribe el TVP en una temperatura local y configura la indexación allí
Aquí hay un excelente artículo sobre TVP con una buena sección sobre consideraciones de rendimiento y qué esperar y cuándo.
Entonces, si le preocupa alcanzar los límites en los parámetros de cadena, los parámetros con valores de tabla podrían ser el camino a seguir. Pero al final, es difícil decirlo sin saber más sobre el conjunto de datos con el que está trabajando.