2012-03-30 6 views
5

Я хочу вставить записи в TempTable. Что-то вроде этого:INSERT INTO SELECT - большое количество записей

insert into ##tempT 
SELECT * FROM MyTable 

MyTable содержит большое количество записей, таким образом, «вставить» занимает много времени.

Если я пытаюсь запустить:

SELECT COUNT(*) FROM ##tempT 

она всегда возвращает "0", пока все записи из "MyTable" вставляются INSERT INTO команды.

Как я могу получить подсчет прогресса, который подскажет мне, сколько записей находится в ## tempT?

Мне нужно обновить значение индикатора выполнения во время выполнения команды SQL.

спасибо.

+0

из любопытства, почему вы вставляете данные в таблицу темп? – Baz1nga

ответ

8

попробовать

set transaction isolation level read uncommitted 
SELECT COUNT(*) FROM ##tempT 
+5

Хорошая точка или лучше: 'select count (*) from ## TempT with (nolock)', чтобы не влиять на состояние соединения. – Ben

+0

Оба сценария «read uncommited» и «nolock» будут работать в вашем сценарии. Тем не менее, они представляют собой опасное оружие, поэтому воздерживаться от их использования в сценариях управления данными (индикатор выполнения работает нормально). – SWeko

+0

cool, even better :) – Diego

1

Вы можете разделить ваш запрос вверх.

x = number of records in MyTable/100 
i = 0 

do until we're done 
    queryString = "insert into ##tempT " 
    queryString += "select top " + x " + " * FROM MyTable " 
    queryString += "where RecordNumber > " + i 

    Execute queryString 
    Update Progress Bar 
    i = i + x 
loop 

Вы заметите, что вам понадобится какое-то поле RecordNumber, чтобы сделать эту работу. Существуют различные способы выполнения, которые вы можете выполнить.

+0

Решение Бена (комментарий к ответу Диего), вероятно, лучше всего подходит для вашего конкретного сценария. Мое решение намного лучше, когда вы ограничены одним потоком, и этот поток выполняет обновление БД и обратную связь с графическим интерфейсом, как обычно нам приходилось делать в дни vb6. –

+2

Это ужасное решение для сегодняшних стандартов. – JotaBe

+0

@ JotaBe Ну, теперь это только больно моим чувствам. Извините, мой ответ вам не понравился. –

1

Используйте хранимую процедуру и DECLARE переменную COUNT и обрабатывайте ее как переменную цикла и каждый раз, когда вставка выполняется, увеличивайте COUNT на 1 и продолжайте ее печатать с использованием другого запроса, когда вы хотите узнать счет .Or, return этот счетчик из процедуры и прочитайте его в своей программе для обновления индикатора выполнения. :)

+0

Вы также можете сохранить запись в очереди, а затем нажать ее как транзакцию в таблицу базы данных, если вам не нужно немедленно ее обновлять в TempTable. Это может повысить производительность и может быть также отключено. – Milee

+0

Вставка выполняется в одной партии. это решение не работает – Diego

+0

Речь идет о вставке в очередь, а не в таблицу. – Milee

Смежные вопросы