Я задаюсь вопросом, там способ сделать пакетное обновление? Я использую SQL-сервер мс 2005.
Я видел далеко с sqlDataAdaptor, но кажется, что Вы имеете к сначала избранному оператору с ним, затем заполняете некоторый набор данных и вносите изменения в набор данных.
Теперь я использую linq для sql, чтобы сделать выбор, таким образом, я хочу попытаться сохранить его тем путем. Однако это также не спешит делать крупные обновления. Так там находится далеко, что я могу сохранить свой linq к 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();
}
}
}
Fredrik Johansson я не уверен, что будет работать Ваше высказывание. Как он кажется мне, Вы хотите, чтобы я сделал оператор обновления для каждой записи. Я не могу сделать этого, так как у меня будет обновление потребности 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
Как сказал аллоним, используйте SqlBulkCopy, который очень быстр (я обнаружил, что скорость увеличилась более чем в 200 раз - с 1500 секунд до 6 секунд). Однако вы можете использовать классы DataTable и DataRows для передачи данных в SQlBulkCopy (что кажется проще). Использование SqlBulkCopy таким образом имеет дополнительное преимущество, которое также имеет совместимость с bein .NET 3.0 (Linq был добавлен только в версии 3.5).
Оформить заказ http://msdn.microsoft.com/en-us/library/ex21zs8x%28v=VS.100%29.aspx , чтобы найти образец кода.
Используйте молниеносный SqlBulkCopy. Вам понадобится настраиваемая реализация IDataReader, которая перечисляет результаты вашего запроса linq. См. http://code.msdn.microsoft.com/LinqEntityDataReader для получения дополнительной информации и некоторого потенциально подходящего кода IDataReader.
Вы должны работать с деревьями выражений напрямую, но это выполнимо. Фактически, это уже было сделано за вас, вам просто нужно загрузить исходный код:
Пакетные обновления и удаления с LINQ to SQL
Альтернативой является использование хранимых процедур или специальных запросов SQL с использованием ] ExecuteMethodCall
и ExecuteCommand
методы DataContext
.
Вы можете использовать sqlDataAdapter для пакетного обновления. Неважно, как вы заполняете свой набор данных. L2SQL или что-то еще, вы можете использовать разные методы для обновления. Просто определите запрос для запуска, используя данные в вашей таблице данных.
Ключевым моментом здесь является UpdateBatchSize. Адаптер данных будет отправлять обновления пакетами любого размера, который вы укажете. Вам нужно истечь с этим значением, чтобы увидеть, какое число работает лучше всего, но обычно числа от 500 до 1000 работают лучше всего.Затем SQL может оптимизировать обновление и выполняться немного быстрее. Обратите внимание, что при выполнении пакетных обновлений вы не можете обновить источник строки таблицы данных.
Я использую этот метод для обновления 10–100 КБ, и обычно он выполняется менее чем за 2 минуты. Однако это будет зависеть от того, что вы обновляете.
Извините, это на VB….
Using da As New SqlDataAdapter
da.UpdateCommand = conn.CreateCommand
da.UpdateCommand.CommandTimeout = 300
da.AcceptChangesDuringUpdate = False
da.ContinueUpdateOnError = False
da.UpdateBatchSize = 1000 ‘Expirement for best preformance
da.UpdateCommand.UpdatedRowSource = UpdateRowSource.None 'Needed if UpdateBatchSize > 1
sql = "UPDATE YourTable"
sql += " SET YourField = @YourField"
sql += " WHERE ID = @ID"
da.UpdateCommand.CommandText = sql
da.UpdateCommand.UpdatedRowSource = UpdateRowSource.None
da.UpdateCommand.Parameters.Clear()
da.UpdateCommand.Parameters.Add("@YourField", SqlDbType.SmallDateTime).SourceColumn = "YourField"
da.UpdateCommand.Parameters.Add("@ID", SqlDbType.SmallDateTime).SourceColumn = "ID"
da.Update(ds.Tables("YourTable”)
End Using
Другой вариант - выполнить массовое копирование во временную таблицу, а затем запустить запрос для обновления из нее основной таблицы. Это может быть быстрее.