Me pregunto si hay alguna manera de hacer actualizaciones por lotes? Estoy usando ms sql server 2005.¿Cómo hacer una actualización por lotes?
Vi con el sqlDataAdaptor pero parece que primero tiene que seleccionar la instrucción con él, luego llenar un conjunto de datos y hacer cambios en el conjunto de datos.
Ahora estoy usando linq a sql para hacer la selección, así que quiero tratar de mantenerlo de esa manera. Sin embargo, es demasiado lento para hacer actualizaciones masivas. Entonces, ¿puedo mantener mi linq en sql (para la parte seleccionada) pero usando algo diferente para hacer la actualización masiva?
Gracias
Editar
Estoy interesado en esta manera tabla de ensayo, pero no estoy seguro de cómo hacerlo y todavía no está claro cómo va a ser más rápido, ya que no entiendo cómo el la parte de actualización funciona
Entonces, ¿alguien puede mostrarme cómo funcionaría esto y cómo manejar las conexiones concurrentes?
Edit2
Este fue mi último intento de tratar de hacer una actualización masiva usando XML sin embargo se utiliza para muchos recursos y mi alojamiento compartido no permite que pase a través. Así que necesito una forma diferente, por eso no estoy buscando en una mesa de preparación.
using (TestDataContext db = new TestDataContext())
{
UserTable[] testRecords = new UserTable[2];
for (int count = 0; count < 2; count++)
{
UserTable testRecord = new UserTable();
if (count == 1)
{
testRecord.CreateDate = new DateTime(2050, 5, 10);
testRecord.AnotherField = true;
}
else
{
testRecord.CreateDate = new DateTime(2015, 5, 10);
testRecord.AnotherField = false;
}
testRecords[count] = testRecord;
}
StringBuilder sBuilder = new StringBuilder();
System.IO.StringWriter sWriter = new System.IO.StringWriter(sBuilder);
XmlSerializer serializer = new XmlSerializer(typeof(UserTable[]));
serializer.Serialize(sWriter, testRecords);
using (SqlConnection con = new SqlConnection(connectionString))
{
string sprocName = "spTEST_UpdateTEST_TEST";
using (SqlCommand cmd = new SqlCommand(sprocName, con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
SqlParameter param1 = new SqlParameter("@UpdatedProdData", SqlDbType.VarChar, int.MaxValue);
param1.Value = sBuilder.Remove(0, 41).ToString();
cmd.Parameters.Add(param1);
con.Open();
int result = cmd.ExecuteNonQuery();
con.Close();
}
}
}
@ Fredrik Johansson No estoy seguro de lo que dices funcionará. Me parece que quieres que haga una declaración de actualización para cada registro. No puedo hacer eso porque necesitaré actualizar 1 a 50,000+ registros y no sabré hasta ese momento.
Datos 3
Así que este es mi SP ahora. Creo que debería poder hacer conexiones concurrentes, pero quería asegurarme.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[sp_MassUpdate]
@BatchNumber uniqueidentifier
AS
BEGIN
update Product
set ProductQty = 50
from Product prod
join StagingTbl stage on prod.ProductId = stage.ProductId
where stage.BatchNumber = @BatchNumber
DELETE FROM StagingTbl
WHERE BatchNumber = @BatchNumber
END
¿Puede explicar/justificar su comentario? ¿Problemas de rendimiento de actualización de LINQ a SQL? –
Básicamente se trata de esto. Quise insertar 500 registros y actualizar 500 registros. La validación duró 1min y 58 segundos, la inserción con copia masiva tomó 2 segundos y el uso de linq a sql para actualizar las 500 filas e insertarlas duró 4 minutos. Quiero bajar eso, ya que probablemente necesite actualizar más de 30,000 a 50,000 filas. Sin embargo, no quiero conectarme con sql para hacer la selección y la manipulación, ya que me resulta más fácil trabajar con un objeto. No me importa cuando se trata de la actualización de lo que parece, ya que debería ser fácil si tengo manipulados todos los registros y puedo extraer los valores – chobo2
de cada uno del objeto linq con un ciclo for y arrojarlo a lo alguna vez es requerido – chobo2