INSERT INTO TABLA SELECT * FROM OTRATABLA CON PRIMARY KEY

06/11/2008 - 22:00 por Alonso Vilela | Informe spam
Amigos tengo una tabla A y otra B
necesito hacer un inser into A select * from B, pero en a existe un primary
key id, como debo hacer para que la el insert sea transparente

Gracias

Preguntas similare

Leer las respuestas

#1 Carlos M. Calvelo
06/11/2008 - 22:20 | Informe spam
Hola Alonso,

On 6 nov, 22:00, "Alonso Vilela" wrote:
Mostrar la cita
Esa columna (la clave primaria) también debes proporcionarla.
Qué quieres decir con 'insert tansparente'?

A ver si esto te vale:

insert into A (colPK, col1, col2)
select valorPK, colA, colB
from <...>

O quieres decir que la clave primaria es identity() ?

(en realidad no te estoy entendiendo)

Saludos,
Carlos
#2 Alonso Vilela
07/11/2008 - 00:13 | Informe spam
Asi es disculpa la gramatica
La clave principal es identica y unica y seria mejor si fuera
autoincremental...

Para eso debo entonces primero hacer un sp que me de el ultimo id sumar 1 y
ese valor usar



"Carlos M. Calvelo" wrote in message
news:
Hola Alonso,

On 6 nov, 22:00, "Alonso Vilela" wrote:
Mostrar la cita
Esa columna (la clave primaria) también debes proporcionarla.
Qué quieres decir con 'insert tansparente'?

A ver si esto te vale:

insert into A (colPK, col1, col2)
select valorPK, colA, colB
from <...>

O quieres decir que la clave primaria es identity() ?

(en realidad no te estoy entendiendo)

Saludos,
Carlos
#3 Carlos M. Calvelo
07/11/2008 - 01:41 | Informe spam
Hola Alonso,

On 7 nov, 00:13, "Alonso Vilela" wrote:
Mostrar la cita
No.

Puedes definir que la columna que es la clave primaria sea
tambien identity(). Entonces al insertar un registro no tienes que
proporcionar ningún valor para esa columna y se autoincrementará
por si sola.

Busca en el esquema de esa tabla en la propiedades de esa
columna y verás el identiy.

Pero te pongo un ejemplo:

declare @A Table (
nr int not null primary key identity(1,1),
nombre varchar(20) not null
)

insert into @A (nombre)
select 'Alonso'
union select 'Carlos'
union select 'Pepito'

select * from @A

como vés no hemos proporcionado la columna 'nr'
pero ahí está.

Yo lo he hecho con una variable @A pero lo mismo
puedes hacer con una tabla 'normal'.

Saludos,
Carlos
#4 GuilleSQL
07/11/2008 - 08:50 | Informe spam
Hola Alonso,

Otra alternativa se utilizar la función ROW_NUMBER() de SQL Server 2005, la
cual, te devolverá un número secuencial. Te pongo un ejemplo:

DECLARE @MiClaveMayorDeA
SELECT @MiClaveMayorDeA=MAX(ID) FROM A

INSERT INTO B
SELECT @MiClaveMayorDeA+row_number() over(order by UnCampoCualquiera) AS ID,
B.*
FROM B

En SQL Server 2000 no existe la función ROW_NUMBER(). Una alternativa es
crear una tabla temporal con un autonumérico e insertar sobre ella.
Seguidamente, insertamos en la tabla final desde la tabla temporal,
añadiéndole al valor del autonumérico el SELECT MAX(ID), como en el ejemplo
anterior.

La ventaja de estas alternativas, está en que un campo Identity NO se puede
actualizar. Además, si deseas insertar sobre un campo Identity deberás
utilizar la opción SET IDENTITY_INSERT [tabla] ON, y después los mismo pero
con OFF. En caso de tener que realizar operaciones UPDATE e INSERT sobre
campos autonuméricos en SQL Server, puede resultar de interés evitarlos y
utilizar alternativas.

Saludos,

GuilleSQL
http://www.guillesql.es


"Alonso Vilela" wrote:

Mostrar la cita
#5 Maxi Accotto
11/11/2008 - 07:06 | Informe spam
Carlos, los identity no soportan transacciones y quedaran huecos en la
numeracion


Saludos
Maxi Accotto
Microsoft MVP en SQLServer
SQltotalconsulting
-

"Carlos M. Calvelo" escribió en el mensaje de
noticias:
Mostrar la cita
Ads by Google
Search Busqueda sugerida