2010-02-03 648 views
10

Estoy buscando crear una tabla temporal que se use como una tabla intermedia al compilar un informe.SQL Server creando una tabla temporal desde otra tabla

Para un poco de historia Estoy portar una aplicación de VB 6 a .NET

Para crear la tabla que puedo usar ...

SELECT TOP 0 * INTO #temp_copy FROM temp; 

Esto crea una copia vacía de la temperatura, pero no crea una clave primaria

¿Hay alguna manera de crear una tabla temporal más las restricciones?

¿Debo crear las restricciones después?

O me sale mejor creando la tabla usando create table, no quería hacer esto porque hay 45 columnas en la tabla y llenaría el procedimiento con una gran cantidad innecesaria de cruft.

Se requiere que la mesa porque mucha gente puede ser la generación de informes al mismo tiempo, así que no puede usar una sola tabla intermediario

Respuesta

7

¿Usted realmente necesita una clave principal? Si está volando y seleccionando solo los datos que necesita el informe, ¿no tendrá que visitar cada fila en la tabla temporal de todos modos?

+0

Me ha resultado útil agregar índices a tablas temporales en ocasiones con resultados impresionantes. Puede haber un procesamiento intermedio o JOINs, etc. – gbn

+1

@gbn: seguro. Los agrego cuando los necesito. –

+0

Tiene razón, puede ser superfluo. Tendré que verificar cada procedimiento. Originalmente la aplicación usaba una sola tabla temporal con una clave principal, pero el número de usuarios era pequeño, ahora me preocupa que la tabla temporal se convierta en un cuello de botella ya que hay muchos más usuarios. – DeveloperChris

6

Habría que hacer una o la otra:

  • añadir los índices PK/después
  • declaran explícitamente la tabla temporal con restricciones.

También me gustaría hacer esto en lugar de TOP 0

SELECT * INTO #temp_copy FROM temp WHERE 1 = 0; 
7

Por diseño, SELECT INTO no se traslada restricciones (PK, FK, único), valores predeterminados, cheques, etc. Esto se debe a un SELECT INTO puede extraer de numerosas tablas a la vez (a través de combinaciones en la cláusula FROM). Como SELECT INTO crea una nueva tabla a partir de la (s) tabla (s) que especifica, SQL realmente no tiene forma de determinar qué restricciones desea conservar y cuáles no desea conservar.

Puede escribir un procedimiento/script para crear la restricción automáticamente, pero es probable que sea demasiado esfuerzo para obtener una ganancia mínima.

+0

Gracias por explicar eso, bastante obvio, supongo tu ves el motivo – DeveloperChris

Cuestiones relacionadas