temporales - En MS-SQL, ¿cómo INSERTO EN una tabla temporal, y tengo un campo IDENTIDAD creado, sin declarar primero la tabla temporal?
tablas temporales sql server 2016 (8)
Buena pregunta y Matt fue una buena respuesta. Para expandir un poco la sintaxis si la tabla antigua tiene una identidad, un usuario podría ejecutar lo siguiente:
SELECT col1, col2, IDENTITY( int ) AS idcol
INTO #newtable
FROM oldtable
-
Eso sería si la vieja tabla estuviera escrita con 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 esta pregunta me ayudó,
Catto
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?
Comentó: no funciona si la tabla antigua tiene una columna de identidad.
Creo que esa es tu 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 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
IIRC, el comando INSERT INTO usa 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.
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
Para hacer las cosas más eficientes, debe declarar que una de las columnas es una clave principal:
ALTER TABLE #mytable
ADD PRIMARY KEY(KeyColumn)
Eso no tomará una variable para el nombre de la columna.
Créame, usted está MUCHO mejor haciendo un: CREAR #myTable TABLE (o posiblemente una TABLA DECLARACIÓN @myTable), que le permite establecer IDENTIDAD y PRIMARY KEY directamente.
Podría hacer un Seleccionar en, que crearía la estructura de la tabla sobre la marcha en función de los campos que seleccione, pero no creo que creará un campo de identidad para usted.
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 una int (suponiendo que sea una ahora), así:
select cast (CurrentID as int) as CurrentID, SomeOtherField, identity(int) as TempID
into #temp
from myserver.dbo.mytable
Si después de *, alias la idcolumn que está rompiendo la consulta por segunda vez ... y le das un nuevo nombre ... mágicamente comienza a funcionar.
Seleccione IDENTITY (int) AS TempID, *, SectionID como Fix2ID en #TempSections desde Files_Sections