Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Duplicar campos de tabla

Estas en el tema de Duplicar campos de tabla en el foro de SQL Server en Foros del Web. Hola amigos tengo este problema, tengo que duplicar filas de una tabla con llave primaria identity, todo esto funciona, pero cuando voy a duplicar otra ...
  #1 (permalink)  
Antiguo 23/11/2012, 17:24
 
Fecha de Ingreso: noviembre-2012
Mensajes: 3
Antigüedad: 11 años, 5 meses
Puntos: 0
Pregunta Duplicar campos de tabla

Hola amigos tengo este problema, tengo que duplicar filas de una tabla con llave primaria identity, todo esto funciona, pero cuando voy a duplicar otra tabla que tiene llaves foraenaas de la primera tabla mencionada no encuentro que solucion darle:

Mejor detallo exactamente las tablas:

la llave cont_vig_c_iid es identity y al ejecutar parte de mi procedimiento que es:
INSERT INTO T_CONT_VIGENCIA
SELECT
V.cont_c_icod,
V.cont_c_yver+1,
V.cont_c_ymod,
V.cont_vig_c_dfec_ini,
V.cont_vig_c_dfec_fin,
V.cont_vig_c_bactivo
FROM T_CONT_VIGENCIA V
WHERE
V.cont_c_icod=@cont_c_icod AND
V.cont_c_yver=@cont_c_yver AND
V.cont_c_ymod=@cont_c_ymod
las variable @cont_c_icod, @cont_c_yver, @cont_c_ymod son (1,1,0) respectivamente, vienen de otra tabla.

hasta ahí todo ok ya que el resultado es:

como se puede ver la
llave 53 y 54 son las replicas que se generaron exitosamente
Ahora viene mi
problema en otra tabla:<

y mi procedimiento de insercion es este:
INSERT INTO T_CONT_RV
SELECT
cont_vig_c_iid,
cont_ex_c_iid,
cont_rv_c_eporc_x_rf,
cont_rv_c_ctipo,
cont_c_icod,
cont_c_yver+1,
cont_c_ymod
FROM T_CONT_RV
WHERE cont_c_icod=@cont_c_icod AND
cont_c_yver=@cont_c_yver AND
cont_c_ymod=@cont_c_ymod
que al ejecutar me brinda el siguiente resultado:

cuyo resultado son las filas con llaves 37 y 38, sin embargo las llaves 27 y 28 estan erradas ya que deberían ser:

53 y 54 respectivamente.

estuve intentando hacer algo como un subselect dentro de la consulta select en el campo cont_rv_c_iid, pero me da error ya que retorna multiples valores.

ojala puedan ayudarme.
  #2 (permalink)  
Antiguo 25/11/2012, 10:55
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Duplicar campos de tabla

No estoy seguro de haberte entendido.
Si intentarás a insertar a la tabla T_CONT_RV filas recuperadas de la misma tabla te vas a fracasar porque la columna cont_rv_c_iid es una clave primaria que no obtiene valores que ya existen.
Si intentarás a insertar filas nuevas sin mencionar la columna T_CONT_RV, la inserción fracasará porque la columna no puede obtener nulos.
Resulta que debes crear valores nuevos que todavia no existen en T_CONT_RV.

Hasta el momento- ¿este es el problema?
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #3 (permalink)  
Antiguo 25/11/2012, 13:46
 
Fecha de Ingreso: noviembre-2012
Mensajes: 3
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Duplicar campos de tabla

efectivamente, lo que debo hacer es una copia exacta de cada fila seleccionada en la misma tabla, pero con las llaves nuevas, ese select es el que necesito (que obvio va a ir en el insert)
  #4 (permalink)  
Antiguo 25/11/2012, 23:27
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Duplicar campos de tabla

Intenta así:
Código SQL:
Ver original
  1. INSERT  INTO T_CONT_RV
  2. SELECT  ROW_NUMBER() OVER(ORDER BY cont_rv_c_iid)+Mx,
  3.         cont_vig_c_iid,
  4.         cont_ex_c_iid,
  5.         cont_rv_c_eporc_x_rf,
  6.         cont_rv_c_ctipo,
  7.         cont_c_icod,
  8.         cont_c_yver+1,
  9.         cont_c_ymod
  10. FROM    (SELECT MAX(cont_rv_c_iid) OVER() Mx,
  11.                 *
  12.         FROM    T_CONT_RV) T
  13. WHERE   cont_c_icod=@cont_c_icod
  14.         AND cont_c_yver=@cont_c_yver
  15.         AND cont_c_ymod=@cont_c_ymod;
Supongo que utilizas la versión 2005 o superior.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #5 (permalink)  
Antiguo 26/11/2012, 14:58
 
Fecha de Ingreso: noviembre-2012
Mensajes: 3
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Duplicar campos de tabla

@GeriReshef:

interesante tu respuesta estimado, sin embargo el codigo da error ya que "Row_Number() Over(ORDER BY cont_rv_c_iid)+Mx" intenta insertar en un campo identity (el excesivo uso de identitys es el que genera dicho problema, pero no desean cambiar los tipo, así que debo solucionarlo como sea).

En mi caso he encontrado una solución, no correcta ni eficiente, pero por lo menos me soluciona el problema temporalmente.

Copio las llaves que se generan en una tabla temporal en la cual guardo tanto la antigua como la nueva, realizo la inserción y luego un update, esto hasta el momento me ha solucionado el problema así:

INSERT INTO T_CONT_RV
SELECT
cont_vig_c_iid,
cont_ex_c_iid,
cont_rv_c_eporc_x_rf,
cont_rv_c_ctipo,
cont_c_icod,
cont_c_yver,
cont_c_ymod+1
FROM T_CONT_RV
WHERE cont_c_icod=@cont_c_icod AND
cont_c_yver=@cont_c_yver AND
cont_c_ymod=@cont_c_ymod
END

y luego:

UPDATE T_CONT_RV
SET cont_vig_c_iid= T.cont_vig_c_iid2
FROM T_CONT_VIG_TEMP T, T_CONT_RV RV
WHERE T.cont_vig_c_iid=RV.cont_vig_c_iid AND
RV.cont_c_icod=@cont_c_icod AND RV.cont_c_ymod=@cont_c_ymod+1 AND RV.cont_c_yver=@cont_c_yver

De este modo lo he logrado ah y la estructura de la tabla temp es solo 2 campos int sin relaciones.

Saludos.

Etiquetas: insert, procedure, sql, store
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:46.