En MS-SQL, ¿cómo INSERTO EN una tabla temporal, y tengo un campo IDENTIDAD creado, sin declarar primero la tabla temporal?


36

Necesito seleccionar un grupo de datos en una tabla temporal para luego hacer algunos cálculos secundarios; Para ayudar a que funcione de manera más eficiente, me gustaría tener una columna de IDENTIDAD en esa tabla. Sé que podría declarar primero la tabla con una identidad, luego insertar el resto de los datos en ella, pero ¿hay alguna forma de hacerlo en 1 paso?

+1

columnas IDENTITY hacer cosas consistente para múltiples usuarios. PRIMARY KEY hace que las cosas sean eficientes. Use ambos para obtener el máximo efecto. 23 sep. 082008-09-23 20:28:18

64

Oh hombres de poca fe:

SELECT *, IDENTITY(int) AS idcol 
    INTO #newtable 
    FROM oldtable 

http://msdn.microsoft.com/en-us/library/aa933208(SQL.80).aspx

  0

No funciona si oldtable tiene una columna de identidad 23 sep. 082008-09-23 20:38:39

+1

Pero, por supuesto, no puede tener dos. Simplemente no seleccione la columna de identificación como parte de la consulta 23 sep. 082008-09-23 20:54:24

  0

. Debe tener cuidado si usa una cláusula ORDER BY y espera que el "idcol" esté en el mismo orden. http://support.microsoft.com/kb/273586 04 oct. 112011-10-04 18:28:36

  0

seleccione conversión (CurrentID como int) como CurrentID le gustaría esto si oldtable tiene una columna de identidad 05 feb. 142014-02-05 17:58:29


-4

IIRC, el comando INSERT INTO utiliza el esquema de la tabla fuente para crear la tabla temporal. Esa es parte de la razón por la que no puedes simplemente tratar de crear una tabla con una columna adicional. Las columnas de identidad están vinculadas internamente a una construcción de SQL Server llamada generador.


-3

Usted podría hacer un SELECT INTO, que crearía la estructura de la tabla sobre la marcha sobre la base de los campos seleccionados, pero no lo hago Creo que creará un campo de identidad para ti.


1

Para hacer las cosas eficiente, lo que necesita hacer declarar que una de las columnas para ser una clave principal:

ALTER TABLE #mytable 
ADD PRIMARY KEY(KeyColumn) 

que no tomará una variable para el nombre de la columna.

Créeme, estás MUCHO mejor haciendo una: CREATE #myTable TABLE (o posiblemente una TABLA DECLARACIÓN @myTable), que te permite establecer IDENTIDAD y PRIMARY KEY directamente.

  0

Depende; las inserciones en una tabla indexada son (con algunas excepciones) más lentas que una tabla no indexada debido al mantenimiento de árbol B +; esta aplicación puede no tener suficientes datos cargados en la tabla temporal para hacer que un índice valga la pena. Totalmente depende de la situación, y no tenemos suficiente información para saber 23 sep. 082008-09-23 20:58:20

  0

Quiere una "identidad" para "hacer las cosas eficientes". Podemos concluir que le gustaría acceder a los elementos mediante una identificación que aún no existe. Es fácil ordenar por una identificación que aún no existe. 23 sep. 082008-09-23 21:53:05

  0

no ha definido eficiente - mi pensamiento era que él quería una identidad no por la velocidad, sino por la facilidad de uso. Pero si se trata de algo de rendimiento, simplemente indexe una de las columnas existentes 23 sep. 082008-09-23 23:19:48


5

Ha comentado: no funciona si la tabla de identidad tiene una columna de identidad.

Creo que esa es su respuesta. La #newtable obtiene una columna de identidad de la tabla antigua automáticamente. Ejecute las siguientes declaraciones:

create table oldtable (id int not null identity(1,1), v varchar(10)) 

select * into #newtable from oldtable 

use tempdb 
GO 
sp_help #newtable 

Le muestra que #newtable tiene la columna de identidad.

Si no desea que la columna de identidad, intente esto en la creación de #newtable:

select id + 1 - 1 as nid, v, IDENTITY(int) as id into #newtable 
    from oldtable 

1

Buena pregunta & Matt fue una buena respuesta.Para ampliar la sintaxis un poco si el oldtable tiene una identidad de un usuario podría ejecutar el siguiente:

SELECT col1, col2, IDENTITY(int) AS idcol 

    INTO #newtable 

    FROM oldtable 

-

Eso sería si el oldtable fue escrito algo como tal:

CREATE TABLE [dbo].[oldtable] 
(
    [oldtableID] [numeric](18, 0) IDENTITY(1,1) NOT NULL, 
    [col1] [nvarchar](50) NULL, 
    [col2] [numeric](18, 0) NULL, 
) 

Thx 4 la información de esta pregunta me ayudó,

Catto


2

Si desea incluir la columna que es la identidad actual, aún puede hacerlo, pero tiene que listar explícitamente las columnas y convertir la identidad actual en un int (asumiendo que es uno ahora), así:

select cast (CurrentID as int) as CurrentID, SomeOtherField, identity(int) as TempID 
into #temp 
from myserver.dbo.mytable 
  0

. Esto me funciona. Gracias 05 feb. 142014-02-05 17:57:34


0

Si después de *, alias la idcolumn que está rompiendo la consulta por segunda vez ... y le da un nuevo nombre ... mágicamente comienza a funcionar.

Select Identity (int) AS IDTEMP, *, sectionid como Fix2IDs en #TempSections de Files_Sections