Lo primero es lo primero:no tengo idea de dónde está obteniendo el tableName
y columnName
, pero si son proporcionados por el usuario, entonces esto está abierto a la inyección de SQL. Como mínimo, use QUOTENAME()
para garantizar que no se inyecte ningún código real.
En segundo lugar, en realidad no está utilizando el TVP. El código que tienes solo dice IN (@IDTable)
que no es como se usa un TVP.
Un TVP es solo una variable de tabla y debe usarse como cualquier otra tabla:
protected virtual void DoDeleteRecords(List<Guid> ids)
{
if (ids.Count == 0)
return;
DataTable tvp = new DataTable();
tvp.Columns.Add("Id", typeof(Guid));
foreach (Guid id in ids)
tvp.Rows.Add(id);
const string sql = @"
DELETE FROM table
WHERE idColumnName IN (SELECT * FROM @IDTable);
";
using(SqlConnection connection = new SqlConnection(CoreSettings.ConnectionString))
using(SqlCommand command = new SqlCommand(sql, connection))
{
command.Parameters.Add(
new SqlParameter("@IDTable", SqlDbType.Structured)
{
Value = tvp,
Direction = ParameterDirection.Input,
TypeName = "dbo.IDList"
});
connection.Open();
command.ExecuteNonQuery();
}
}