Мне интересно, есть ли способ сделать пакетное обновление? Я использую MS SQL Server 2005.
Я проверил с sqlDataAdaptor, но кажется, что сначала нужно с ним выбрать оператор select, затем заполнить некоторый набор данных и внести изменения в набор данных.
Теперь я использую linq to sql для выбора, поэтому я хочу попытаться сохранить его таким образом. Однако это слишком медленно, чтобы делать массовые обновления. Так что, я могу оставить свой linq to sql (для выбранной части), но с помощью чего-то другого, чтобы выполнить массовое обновление?
Спасибо
Редактировать
Мне интересен этот способ подготовки таблицы, но я не уверен, как это сделать, и до сих пор не ясно, как это будет быстрее, поскольку я не понимаю, как работает часть обновления.
Так может кто-нибудь показать мне, как это будет работать и как работать с параллельными соединениями?
Edit2
Это была моя последняя попытка сделать массовое обновление с использованием xml, однако оно использует много ресурсов, и мой общий хостинг не позволяет пройти через него. Поэтому мне нужен другой способ, поэтому я не смотрю на промежуточный стол.
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();
}
}
}
@ Фредрик Йоханссон Я не уверен, что ваше высказывание сработает. Как мне кажется, вы хотите, чтобы я сделал заявление об обновлении для каждой записи. Я не могу этого сделать, так как мне нужно будет обновить от 1 до 50 000 записей, и я не буду знать до этого момента.
Редактировать 3
Так что теперь это мой SP. Я думаю, что это должно быть в состоянии делать параллельные соединения, но я хотел убедиться.
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