sql >> Base de Datos >  >> RDS >> Sqlserver

C# y SQL Server:la mejor manera de eliminar varias filas de una sola vez mediante un procedimiento almacenado

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();

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

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.