Несколько операторов SQL Update в одном запросе - PullRequest
11 голосов
/ 06 февраля 2012

Я нахожусь в ситуации, когда мне приходится обновлять около 12 000 элементов в моей БД.Каждая строка должна отражать файл Excel, который я сделал ранее.Я создал файл, который создает каждую строку оператора SQL, но я не уверен, что смогу выполнить каждую строку в одном запросе.

Это пример того, что я пытаюсь сделать.

UPDATE [STORESQL].[dbo].[RPT_ITM_D] SET F1301='1.29' WHERE F01='0000000000001'
UPDATE [STORESQL].[dbo].[RPT_ITM_D] SET F1301='1.39' WHERE F01='0000000000002'

Будет ли это работать, или есть ли лучшие варианты того, чего я пытаюсь достичь?

Каждый элемент будет иметь уникальное значение, а столбец, который нужно изменить, будет иметь уникальное значение,Я не понимаю, как я мог бы сделать это с помощью цикла или любых других методов, которые я нашел до сих пор.Я понимаю, что это может занять много времени, но время не проблема.

Заранее спасибо

Ответы [ 6 ]

19 голосов
/ 06 февраля 2012

Что-то вроде этого - лучшее, что вы можете сделать: -

UPDATE [STORESQL].[dbo].[RPT_ITM_D] 
SET   F1301 = 
      case  F01 
      when '0000000000001' then '1.29'
      when '0000000000002' then '1.30'
end

Кроме этого, стоит запустить несколько обновлений.

9 голосов
/ 06 февраля 2012

Да, вы можете добавить все однострочные операторы Update в одном запросе, как вы делаете.

2 голосов
/ 06 февраля 2012

Взгляните на MERGE например. что-то вроде:

MERGE INTO [STORESQL].[dbo].[RPT_ITM_D] 
   USING (
          VALUES ('1.29', '0000000000001'),
                 ('1.39', '0000000000002')
         ) AS source (F1301, F01)
   ON F01 = source.F01
WHEN MATCHED THEN
   UPDATE
      SET F1301 = source.F1301;

... но использование конструктора табличных значений таким образом не приведет к масштабированию до 12 000 строк! Итак, сначала скопируйте данные из Excel в таблицу на сервере, а затем используйте таблицу в качестве источника, например.

MERGE INTO [STORESQL].[dbo].[RPT_ITM_D] 
   USING [STORESQL].[dbo].MyStagingTable AS source
      ON F01 = source.F01
WHEN MATCHED THEN
   UPDATE
      SET F1301 = source.F1301;
2 голосов
/ 06 февраля 2012

Я думаю, что лучший способ - это импортировать лист Excel в таблицу в вашей базе данных SQL. Оттуда вы можете использовать объединение для создания единого оператора обновления для всех 12 000 элементов.

Для получения информации о том, как импортировать лист Excel в SQL: http://msdn.microsoft.com/en-us/library/ms141209.aspx

Оператор обновления будет выглядеть примерно так:

UPDATE itemTable
SET F1301 = excelTable.<column with your value>
FROM [STORESQL].[dbo].[RPT_ITM_D] itemTable inner join [STORESQL].[dbo].[importedExcelTableName] excelTable on itemTable.F01 = excelTable.<column with the item code>

Если вы не уверены, что это будет работать безопасно, вы можете попробовать этот запрос для одного значения, просто добавив:

WHERE itemTable.F01 = '0000000000001'
1 голос
/ 13 февраля 2014

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

concatenate ("Update set =" ,,", where =" ,, ";")

Используйте вышеуказанный формат и перетащите ячейку до конца или дважды щелкните в правом нижнем углу для автоматического заполнения оператора Update.Я считаю, что это самый короткий путь, и запускаю его за один раз.

1 голос
/ 06 февраля 2012

Если у вас есть значительный объем данных для обновления, может быть выгодно загрузить файл Excel в базу данных в виде таблицы, а затем обновить вашу таблицу на основе данных в этой загруженной таблице.

   UPDATE RPT_ITM_D
      SET F1301 = NewTable.Value
     FROM RPT_ITM_D INNER JOIN NewTable ON (NewTable.F01 = RPT_ITEM_D.F01);

Если вы находитесь на сервере SQL, вы можете использовать SSIS для быстрой загрузки файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...