Как сделать пакетное обновление?

Я задаюсь вопросом, там способ сделать пакетное обновление? Я использую 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
6
задан chobo2 31 May 2010 в 18:07
поделиться

4 ответа

Как сказал аллоним, используйте 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 , чтобы найти образец кода.

1
ответ дан 17 December 2019 в 07:01
поделиться

Используйте молниеносный SqlBulkCopy. Вам понадобится настраиваемая реализация IDataReader, которая перечисляет результаты вашего запроса linq. См. http://code.msdn.microsoft.com/LinqEntityDataReader для получения дополнительной информации и некоторого потенциально подходящего кода IDataReader.

1
ответ дан 17 December 2019 в 07:01
поделиться

Вы должны работать с деревьями выражений напрямую, но это выполнимо. Фактически, это уже было сделано за вас, вам просто нужно загрузить исходный код:

Пакетные обновления и удаления с LINQ to SQL

Альтернативой является использование хранимых процедур или специальных запросов SQL с использованием ] ExecuteMethodCall и ExecuteCommand методы DataContext .

0
ответ дан 17 December 2019 в 07:01
поделиться

Вы можете использовать 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

Другой вариант - выполнить массовое копирование во временную таблицу, а затем запустить запрос для обновления из нее основной таблицы. Это может быть быстрее.

2
ответ дан 17 December 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: