2012-03-30 26 views
5

Quiero insertar registros en una TempTable. Algo como esto:INSERT INTO SELECT - gran cantidad de registros

insert into ##tempT 
SELECT * FROM MyTable 

MiTabla contiene una gran cantidad de registros por lo que el "insertar en" lleva mucho tiempo.

Si trato de ejecutar:

SELECT COUNT(*) FROM ##tempT 

vuelve siempre "0" hasta que todos los registros de "MyTable" son insertados por comando INSERT INTO.

¿Cómo puedo obtener un recuento de progreso que me indique cuántos registros hay en ## tempT?

Necesito actualizar el valor de la barra de progreso mientras se ejecuta el comando SQL.

Gracias.

+0

por curiosidad, ¿por qué insertar datos en una tabla temporal? – Baz1nga

Respuesta

8

tratar

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

Buen punto, o mejor aún: 'seleccionar conteo (*) desde ## TENTADO con (nolock)' para evitar afectar el estado de la conexión. – Ben

+0

Ambos 'leer sin compromiso' y' nolock' funcionarán en su escenario. Sin embargo, ambas son armas peligrosas, por lo que deben abstenerse de utilizarlas en escenarios de manipulación de datos (una barra de progreso está bien). – SWeko

+0

genial, incluso mejor :) – Diego

1

Usted puede dividir su consulta para arriba.

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 

Sin embargo, notará que necesitará algún tipo de campo RecordNumber para que esto funcione. Hay varias formas de lograr que puede buscar.

+0

La solución de Ben (comentario de la respuesta de Diego) es probablemente la mejor para su situación particular. Mi solución es mucho mejor cuando estás limitado a un único hilo y ese hilo está haciendo la actualización de DB y los comentarios de la GUI, como generalmente tuvimos que hacer en los vb6 días. –

+2

Esta es una solución horrible para los estándares actuales. – JotaBe

+0

@JotaBe Bueno, ahora eso solo hiere mis sentimientos. Lo siento, mi respuesta no te complació. –

1

Utilice un procedimiento almacenado y DECLARACIÓN de un COUNT variable y trátelo como una variable de bucle y cada vez que realice una inserción, incremente COUNT en 1 y siga imprimiendo con otra consulta cada vez que desee saber el recuento .O bien, devuelva este conteo del procedimiento y lo leyó en su programa para actualizar la barra de progreso. :)

+0

También puede seguir registrándolo en una cola y luego presionándolo como una transacción a la tabla DB en caso de que no necesite actualizarlo en TempTable inmediatamente. Puede mejorar el rendimiento y también puede realizarse fuera de línea. – Milee

+0

la inserción se realiza en un lote. esta solución no funcionará – Diego

+0

Se trata de insertar en la cola no una tabla. – Milee

Cuestiones relacionadas