Estoy trabajando en un componente .NET que obtiene un conjunto de datos de la base de datos, realiza cierta lógica comercial en ese conjunto de datos y luego actualiza registros individuales en la base de datos a través de un procedimiento almacenado similar al spUpdateOrderDetailDiscountedItem
.¿Cuál es una buena alternativa para disparar un procedimiento almacenado 368 veces para actualizar la base de datos?
Para pequeños conjuntos de datos, esto no es un problema, pero cuando tenía un gran conjunto de datos que requerían una iteración de 368 llamadas de proceso almacenadas para actualizar los registros en la base de datos, me di cuenta de que tenía un problema . Un desarrollador senior miró mi código de proceso almacenado y dijo que se veía bien, pero ahora me gustaría explorar un mejor método para enviar datos "por lotes" a la base de datos.
¿Qué opciones tengo para actualizar la base de datos por lotes? ¿Es esto posible con procs almacenados? ¿Qué otras opciones tengo?
No tendré la opción de instalar un ORM en toda regla, pero cualquier consejo es apreciado.
Antecedentes Información adicional:
Nuestro modelo de acceso a datos actual fue construido hace 5 años y todas las llamadas a la base de datos recibe actualmente ejecuta a través de las funciones modulares/estáticas con nombres como ExecQuery
y GetDataTable
. No estoy seguro de que esté requiriera para permanecer dentro de ese modelo, pero tendría que proporcionar una muy buena justificación para salir de nuestro DAL actual para llegar al DB.
También vale la pena señalar, soy bastante nuevo en lo que respecta a las operaciones CRUD y la base de datos. Prefiero jugar/trabajar en el lado .NET del código, pero los datos tienen que almacenarse en algún lugar, ¿verdad?
contenidos procedimiento almacenado:
ALTER PROCEDURE [dbo].[spUpdateOrderDetailDiscountedItem]
-- Add the parameters for the stored procedure here
@OrderDetailID decimal = 0,
@Discount money = 0,
@ExtPrice money = 0,
@LineDiscountTypeID int = 0,
@OrdersID decimal = 0,
@QuantityDiscounted money = 0,
@UpdateOrderHeader int = 0,
@PromoCode varchar(6) = '',
@TotalDiscount money = 0
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
Update OrderDetail
Set Discount = @Discount, ExtPrice = @ExtPrice, LineDiscountTypeID = @LineDiscountTypeID, LineDiscountPercent = @QuantityDiscounted
From OrderDetail with (nolock)
Where OrderDetailID = @OrderDetailID
if @UpdateOrderHeader = -1
Begin
--This code should get code the last time this query is executed, but only then.
exec spUpdateOrdersHeaderForSkuGroupSourceCode @OrdersID, 7, 0, @PromoCode, @TotalDiscount
End
368 operaciones no es mucho. – Fosco
Necesita ver el contenido del procedimiento almacenado, incluso si se ha abstraído ... –
Casi todos los ORM aún realizarán 368 llamadas a la base de datos. Simplemente las procesan por lotes. – NotMe