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

Ayuda con un Cursor

Estas en el tema de Ayuda con un Cursor en el foro de SQL Server en Foros del Web. Hola amigos, tengo la siguiente consulta: tengo una tabla que debe confirmar datos mensualmente Ejemplo: TABLA PERSONAS_NUEVAS cod nombre edad 1-v Jose 18 2-y Felipe ...
  #1 (permalink)  
Antiguo 25/06/2010, 01:25
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Pregunta Ayuda con un Cursor

Hola amigos, tengo la siguiente consulta:
tengo una tabla que debe confirmar datos mensualmente
Ejemplo:

TABLA PERSONAS_NUEVAS
cod nombre edad
1-v Jose 18
2-y Felipe 24
6-h Martin 31
9-m Lucia 27
.
.

TABLA PERSONAS_ANTIGUAS
cod ver nombre edad
1 v Jose 18
6 h Martin 31
9 m Lucia 28
.
.

Necesito un procedimiento almacenado, que me permita hacer 3 cosas:
1.- Insertar solo los registros que no esten en la tabla "PERSONAS_AnTIGUAS" desde la tabla "PERSONAS_NUEVAS" (En el ejemplo: 2-y, Felipe,24).
2.- Si la persona de la tabla "PERSONAS_NUEVAS" se encuentra en la tabla "PERSONAS_ANTIGUAS" actualizar la edad, si esta ya no es igual.
3.- Separar el campo "cod" de la tabla "PERSONAS_NUEVAS" en los 2 campos de la tabla "PERSONAS_antigua" (campos: "cod" y "ver").

Estoy tratando de hacerlo con un cursor, pero mi nula experiencia y conocimiento en SQL, no me ha dejado entender como poder hacerlo.

Espero puedan ayudarme.

Saludos a todos y gracias de antemano.
  #2 (permalink)  
Antiguo 25/06/2010, 07:47
Avatar de vrenzo  
Fecha de Ingreso: febrero-2007
Mensajes: 289
Antigüedad: 17 años, 2 meses
Puntos: 15
Respuesta: Ayuda con un Cursor

Hola.. si pones el codigo que ya tienes ... es mas facil decir que te falta agregar ... o cuales son los errores...
__________________
***
Saludos.
  #3 (permalink)  
Antiguo 25/06/2010, 08:57
Avatar de -rommel_  
Fecha de Ingreso: junio-2008
Ubicación: Lima
Mensajes: 360
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Ayuda con un Cursor

claro hasta creoq ue se puede hacer con "Insert Into" y con un "Update", pero coloca tu consulta para poder guiarte mejor... jeje Saludos.
  #4 (permalink)  
Antiguo 26/06/2010, 12:07
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Hola amigos, gracias por su interes,

bueno como les comentaba, son mis primeros pasos, entonces, hay cosas que no se como se pudieran hacer, estuve tratando de estructurar un cursor segun algunos tutoriales q visto, creo q el insertar "personas nuevas" separando el campo "cod" en 2 seria asi:

ALTER PROCEDURE [dbo].[TraspasoDeDatos]
AS
BEGIN
DECLARE @cod AS VARCHAR (50)
DECLARE @Ncod AS int
DECLARE @Nver AS VARCHAR (1)
DECLARE @nombre AS VARCHAR (50)
DECLARE @edad
DECLARE traspaso_personas cursor for
SELECT [codigo]
,[nombre]
,[edad]
FROM personas_nuevas
OPEN traspaso_personas
FETCH next from traspaso_personas
INTO @cod,@nombre,@edad
while @@fetch_status = 0
begin
fetch next from traspaso_personas
INTO @cod,@nombre,@edad
SET @Ncod=CONVERT(INT,SUBSTRING(@cod,0,CHARINDEX('-', @cod)))
SET @Nver= SUBSTRING (@cod,CHARINDEX('-', @cod)+1,LEN(@cod))
INSERT INTO personas_antiguas (id_cod,verif,nombre,edad) VALUES (@Ncod,@Nver,nombre,@edad)
end
close traspaso_personas
deallocate traspaso_personas
END
END


Ahora lo que no se me ocurre como hacerlo, es que solo inserte cuando las "personas nuevas" no se encuentres en la tabla "personas antiguas" y ademas, que si se encuentra "la personas nuevas" en la tabla "personas antiguas" pero la edad ya cambio, que actualice, el registro.

espero se entienda y puedan ayudarme, estoy un tanto complicado, por q no se nada de SQL, se entiede que todo se trata de practica, y es lo que me hace falta, son muchas tablas que tengo que hacer el mismo proceso, asi que teniendo este ejemplo, ya tendria el metodo para utilizarlas en las siguientes.

Saludos y gracias por su atencion.
  #5 (permalink)  
Antiguo 27/06/2010, 10:50
 
Fecha de Ingreso: junio-2010
Mensajes: 5
Antigüedad: 13 años, 9 meses
Puntos: 1
Respuesta: Ayuda con un Cursor

ante todo, soy nuevo en esto y es raro q yo este dando solucion o almenos eso espero, bueno ahi te va el codigo:


ALTER PROCEDURE [dbo].[TraspasoDeDatos]
AS
BEGIN
DECLARE @cod AS VARCHAR (50)
DECLARE @Ncod AS int
DECLARE @Nver AS VARCHAR (1)
DECLARE @nombre AS VARCHAR (50)
DECLARE @edad
DECLARE traspaso_personas cursor for
SELECT [codigo]
,[nombre]
,[edad]
FROM personas_nuevas
OPEN traspaso_personas
FETCH next from traspaso_personas
INTO @cod,@nombre,@edad
while @@fetch_status = 0
begin
fetch next from traspaso_personas
INTO @cod,@nombre,@edad
SET @Ncod=CONVERT(INT,SUBSTRING(@cod,0,CHARINDEX('-', @cod)))
SET @Nver= SUBSTRING (@cod,CHARINDEX('-', @cod)+1,LEN(@cod))

if exist(select * from personas_antiguas where id_cod=@cod) then
begin
update personas_antiguas set nombre=@nombre,edad=@edad where id_cod=@cod
end
else
begin
INSERT INTO personas_antiguas (id_cod,verif,nombre,edad) VALUES (@Ncod,@Nver,@nombre,@edad)
end

end
close traspaso_personas
deallocate traspaso_personas
END
END


Creo que usando "exist" o "not exist" saldria:

-exist(select * from personas_antiguas where id_cod=@cod), el exist lo q hace es devolverte un valor logico si el select te devuelve filas en caso contrario false, lo q quiere decir q si el exist te devuelve true ,la persona existe en tu tabla personas antiguas
  #6 (permalink)  
Antiguo 27/06/2010, 11:01
 
Fecha de Ingreso: junio-2010
Mensajes: 5
Antigüedad: 13 años, 9 meses
Puntos: 1
Respuesta: Ayuda con un Cursor

ahh, disculpa el codigo anterior esta mal xD!.


aca te lo corrijo:


ALTER PROCEDURE [dbo].[TraspasoDeDatos]
AS
BEGIN
DECLARE @cod AS VARCHAR (50)
DECLARE @Ncod AS int
DECLARE @Nver AS VARCHAR (1)
DECLARE @nombre AS VARCHAR (50)
DECLARE @edad
DECLARE traspaso_personas cursor for
SELECT [codigo]
,[nombre]
,[edad]
FROM personas_nuevas
OPEN traspaso_personas
FETCH next from traspaso_personas
INTO @cod,@nombre,@edad
while @@fetch_status = 0
begin
fetch next from traspaso_personas
INTO @cod,@nombre,@edad
SET @Ncod=CONVERT(INT,SUBSTRING(@cod,0,CHARINDEX('-', @cod)))
SET @Nver= SUBSTRING (@cod,CHARINDEX('-', @cod)+1,LEN(@cod))

if exists(select * from personas_antiguas where id_cod=@cod)
begin
update personas_antiguas set nombre=@nombre,edad=@edad where id_cod=@cod
end
else
begin
INSERT INTO personas_antiguas (id_cod,verif,nombre,edad) VALUES (@Ncod,@Nver,@nombre,@edad)
end

end
close traspaso_personas
deallocate traspaso_personas
END
END


y son con estas sentencias "exists" o "not exists".

eso me pasa por no practicar -.-!.
  #7 (permalink)  
Antiguo 28/06/2010, 02:30
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Hola Amigos,

Muchas Gracias dvp28, me sido de mucha ayuda tu codigo, tanto asi q ya me resulta
solo tengo 3 dudas

1.- Si tengo la tabla "personas_antiguas" sin datos (primera vez que se llena), al ejecutar, la query, me deja el primer registro afuera, entiendo q es por la operacion de insertar o actualizar se hace desde el segundo registro en adelante, entonces, debo hacer un INSERT entre del primer INTO y el WHILE??

2.- Considerando que el campo id_cod de la tabla "personas antiguas" solo guarda lo que hay antes del guion (-) y que es un valor irrepetible (PK), en el SELECT dentro del EXISTS y el UPDATE, deberia compararse con el @NCOD, que es donde estoy guardando todo el codigo antes del guion (-) verdad?

3.- Por lo que veo, estaria bien el UPDATE, sin embargo no me actualiza los datos, deberia ir algo mas ahi?

Muchas gracias de antemano por su ayuda, me han dado un gran respiro por que ya puedo llenar la tabla solo faltan esos pequeños detalles que me tienen dando vueltas.

Saludos.
  #8 (permalink)  
Antiguo 28/06/2010, 09:38
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Ayuda con un Cursor

Siempre es recomendable intentar hacerlo sin cursores:
Código SQL:
Ver original
  1. UPDATE personas_antiguas
  2. SET nombre=nombre,edad=edad
  3. FROM personas_antiguas A
  4. INNER JOIN personas_nuevas N ON A.id_cod = N.codigo
  5.  
  6. INSERT INTO personas_antiguas (id_cod,verif,nombre,edad)
  7. SELECT CONVERT(INT,SUBSTRING(N.codigo,0,CHARINDEX('-', N.codigo))),
  8. SUBSTRING(N.codigo,CHARINDEX('-', N.codigo)+1,LEN(N.codigo)),N.nombre,N.edad
  9. FROM personas_nuevas N
  10. WHERE NOT EXISTS(
  11.     SELECT 1 FROM personas_antiguas A WHERE A.id_cod = N.codigo
  12. )
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #9 (permalink)  
Antiguo 28/06/2010, 09:54
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Ayuda con un Cursor

1000%, sin cursores es mejor.......
  #10 (permalink)  
Antiguo 29/06/2010, 02:17
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Hola amigos, Realmente agradezco la ayuda que me estan dando, es una sorpresa para mi, verme programando en SQL.

flaviovich: excelente ejemplo, aunque me haz dejado bobo, con el inner join y esa query tan pequeña, realmente buenisima, comparada con el tremendo codigo que yo tenia

solo que en tu codigo a diferencia del usuario dvp28, no modifica ni actualiza. Ahora bien si le agrego la ruta completa de la base de datos:
[Movimiento_Personas].[dbo].[personas_Antiguas]
[Movimiento_Personas].[dbo].[personas_Nuevas]
Ejecuta la actualizacion de los registros, pero no me inserta registros nuevos, indicandome este mensaje de error:

Violation of PRIMARY KEY constraint 'PK_personas_antiguas_1'. Cannot insert duplicate key in object 'dbo.personas_antiguas'.

Alguna idea? algo tendre mal declarado en la tabla "personas_antiguas" ??

lo que he hecho de momento, solo como prueba, es usando el Cursor que tenia hecho, agregandole el codigo de Insertar Datos nuevos que me dio el usuario dvp28 y dejando el codigo de modificacion que me dio flaviovich (con el inner Join), se nota que estoy gastando memoria de mas, por que se siente (en el tiempo de espera) que se demora mas de la cuenta.

que puede estar mal?

De antemano muchisimas gracias nuevamente
  #11 (permalink)  
Antiguo 29/06/2010, 13:39
 
Fecha de Ingreso: junio-2010
Mensajes: 5
Antigüedad: 13 años, 9 meses
Puntos: 1
Respuesta: Ayuda con un Cursor

yo tambien pienso q los cursores no se deben usar xD!, ahh y me gusto la forma como usa el inner join en un update. nu lo sabia!!.

bueno con respecto al error creo o almenos pienso, q es porq no obtuvo el numero del cod ya q esta en una cadena "1-v" :

INSERT INTO personas_antiguas (id_cod,verif,nombre,edad)
SELECT CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-',N.cod))),
SUBSTRING(N.cod,CHARINDEX('-', N.cod)+1,LEN(N.cod)),
N.nombre,N.edad
FROM personas_nuevas N
WHERE NOT EXISTS(
SELECT 1,2 FROM personas_antiguas A WHERE A.id_cod =CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-',N.cod)))
)

ya q si comparamos ejem: "1-v" con numeros enteros del campo "id_cod", ps no se parecen en nada -.-, y por lo tanto devolvera siempre true y con lo cual querra insertar todos los registros de la tabla "personas_Nuevas" a la tabla "personas_Antiguas" con id q ya estan en la tabla.


bueno, espero eso sea xD!.
  #12 (permalink)  
Antiguo 29/06/2010, 16:36
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Hola amigo dvp28:

efectivamente asi es como tengo el codigo, tal cual tu lo colocas :

Cita:
UPDATE personas_antiguas
SET nombre=nombre
,edad=edad

FROM personas_antiguas A
INNER JOIN personas_nuevas N ON A.cod = CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod)))

INSERT INTO personas_antiguas ([id_cod],[verif],[nombre],[edad])
SELECT CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod)))
,SUBSTRING(N.cod,CHARINDEX('-', N.cod)+1,LEN(N.cod))
,N.nombre
,N.edad
FROM personas_nuevas N
WHERE NOT EXISTS(
SELECT 1 FROM personas_antiguas A WHERE A.id_cod = CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod))))
Lo que me haz dejado intrigado tu, es que flaviovich en el ultimo SELECT coloca:

Cita:
SELECT 1 FROM personas_antiguas
Y tu colocas:

Cita:
SELECT 1,2 FROM personas_antiguas
Para que es esto??

Ahora bien, tal cual esta ese codigo, la query no hace nada, pero si coloco la ruta completa de la Base y las tablas, solo me ejecuta el UPDATE.

el codigo es asi:

Cita:
UPDATE [Movimiento_Personas].[dbo].[personas_antiguas]
SET nombre=nombre
,edad=edad

FROM [Movimiento_Personas].[dbo].[personas_antiguas] A
INNER JOIN [Movimiento_Personas].[dbo].[personas_nuevas] N ON A.cod = CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod)))

INSERT INTO [Movimiento_Personas].[dbo].[personas_antiguas] ([id_cod],[verif],[nombre],[edad])
SELECT CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod)))
,SUBSTRING(N.cod,CHARINDEX('-', N.cod)+1,LEN(N.cod))
,N.nombre
,N.edad
FROM [Movimiento_Personas].[dbo].[personas_nuevas] N
WHERE NOT EXISTS(
SELECT 1 FROM [Movimiento_Personas].[dbo].[personas_antiguas] A WHERE A.id_cod = CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod))))
Este codigo como les mencionaba, me ejecuta el UPDATE, pero no asi el INSERT, mencionandome el error que les comentaba en el mensaje anterior:

Cita:
Violation of PRIMARY KEY constraint 'PK_personas_antiguas_1'. Cannot insert duplicate key in object 'dbo.personas_antiguas'.
gracias de antemano y estare atento a sus comentarios
  #13 (permalink)  
Antiguo 30/06/2010, 08:38
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Ayuda con un Cursor

Si sale ese error es porque no esta bien el select del EXISTS.
Tienes que buscar que el ID que vas a insertar no exista en dicha tabla de acuerdo a la PK definida.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #14 (permalink)  
Antiguo 30/06/2010, 15:48
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Hola flaviovich, Hola amigos del Foro:

flaviovich; por lo que entiendo en el WHERE del SELECT donde esta el EXISTS en vez de ser:
Cita:
SELECT 1 FROM [Movimiento_Personas].[dbo].[personas_antiguas] A WHERE A.id_cod = CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod))))
debiese ser:

Cita:
SELECT 1 FROM [Movimiento_Personas].[dbo].[personas_antiguas] A WHERE A.id_cod <> CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod))))
Distinto en vez de Igual ??

o al menos eso entendi....

Saludos y atento a sus comentarios

Graciass
  #15 (permalink)  
Antiguo 30/06/2010, 16:24
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Ayuda con un Cursor

El PK de la tabla Movimiento_Personas solo esta compuesto por id_cod?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #16 (permalink)  
Antiguo 30/06/2010, 16:29
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Sip amigo mio solo por el id_cod
  #17 (permalink)  
Antiguo 30/06/2010, 16:36
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Un dato real para que se entienda mejor seria algo asi:

Tabla "personas_antiguas"
Id_cod ver
1547 F

y que en la tabla "personas nuevas" viene asi:

cod
1547-F

pero como tu bien consultas flaviovich, solo el id_cod de la tabla "personas_antiguas" es el PK.
  #18 (permalink)  
Antiguo 30/06/2010, 17:13
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Ayuda con un Cursor

Pues esta raro. El NOT EXISTS(...) justamente evita ese tipo de problemas.
Revisa bien todo, nosotros estamos a ciegas de este lado.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #19 (permalink)  
Antiguo 30/06/2010, 17:38
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Ayuda con un Cursor

Con el permiso, si trae un GUION de mas, quitaselo "temporalmente" con REPLACE, claro que esta que ambos datos son TOTALMENTE DIFERENTES, ya con el simple hecho de traer un GUION
  #20 (permalink)  
Antiguo 01/07/2010, 00:08
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Hola amigos nuevamente. Busco y busco pero no encuentro que pueda ser

el unico antecedente que tengo es que si ejectuto esto:

Cita:
SELECT CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod)))
,SUBSTRING(N.cod,CHARINDEX('-', N.cod)+1,LEN(N.cod))
,N.nombre
,N.edad
FROM [Movimiento_Personas].[dbo].[personas_nuevas] N
WHERE NOT EXISTS(
SELECT * FROM [Movimiento_Personas].[dbo].[personas_antiguas] WHERE id_cod = CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod))))
me genera la consulta completa de la tabla "personas nuevas" separandome el cod y el ver. pero creo que lo que esta mal es el NOT EXISTS, por que la consulta me genera los que estan repetidos dentro de la misma tabla "personas_nuevas".

espero que este antecedente pueda ser de utilidad para uds que saben,

estare atento a sus consultas o comentarios
  #21 (permalink)  
Antiguo 01/07/2010, 03:06
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Amigos del foro, les pido mil, pero mil disculpas, de tanto tratar de buscar una solucion, acabo de darme cuenta, del porque me aparece el error mencionado:

Cita:
Violation of PRIMARY KEY constraint 'PK_personas_antiguas_1'. Cannot insert duplicate key in object 'dbo.personas_antiguas'.
y es que se me olvido explicar algo que obvie.

la tabla "personas_nuevas" viene en algunos casos con el campo "cod" repetido; entonces, si un registro en la tabla "personas_nuevas" no existe en la tabla "personas_antiguas", se debe insertar en esta ultima, si se repitiese el mismo registro en la tabla "personas nuevas" el o los siguientes registros debiesen ser obviados (por eso es que no me dejaba pasar mas de uno, por ser PK) trate de hacerlo anidado con un DISTINCT pero solo me retorna el campo solicitado como "distinto"no asi el registro completo. De verdad se me cae la cara de verguenza por no explicar eso desde un principio. como me di cuenta? le saque la PK al campo id_cod de la tabla "personas_antiguas" y al ejecutar la query, pasaron todos los registros, incluidos los repetidos. Dandome cuenta que la query de insercion esta bien

el codigo quedo asi:

Cita:
INSERT INTO [Movimiento_Personas].[dbo].[personas_antiguas] ([id_cod],[verif],[nombre],[edad])
SELECT CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod)))
,SUBSTRING(N.cod,CHARINDEX('-', N.cod)+1,LEN(N.cod))
,N.nombre
,N.edad
FROM [Movimiento_Personas].[dbo].[personas_nuevas] N
WHERE NOT EXISTS(
SELECT A.id_cod FROM [Movimiento_Personas].[dbo].[personas_antiguas] A WHERE A.id_cod = CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod))))
como podria hacerlo, para no pasar los repetidos de la tabla "personas_nuevas"???

muchas gracias de antemano y estare atento a su ayuda, comentarios y sugerencias.

Saludos a todos
  #22 (permalink)  
Antiguo 01/07/2010, 09:04
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Ayuda con un Cursor

A ver prueba asi:
Código SQL:
Ver original
  1. INSERT INTO [Movimiento_Personas].[dbo].[personas_antiguas] ([id_cod],[verif],[nombre],[edad])
  2. SELECT *
  3. FROM (
  4.     SELECT DISTINCT CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod)))
  5.     ,SUBSTRING(N.cod,CHARINDEX('-', N.cod)+1,LEN(N.cod))
  6.     ,N.nombre
  7.     ,N.edad
  8.     FROM [Movimiento_Personas].[dbo].[personas_nuevas]
  9. ) N
  10. WHERE NOT EXISTS(
  11.     SELECT 1 FROM [Movimiento_Personas].[dbo].[personas_antiguas] A
  12.     WHERE A.id_cod = CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod)))
  13. )
Aunque me late que no va a funcionar. Mejor ponme unos registros de ejemplo.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #23 (permalink)  
Antiguo 01/07/2010, 09:58
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Hola amigo flaviovich:

aqui van unos registros de ejemplo

tabla "personas_nuevas"

cod nombre edad
14710-1 Jose 55
15879-9 Maria 27
1470-0 Miguel 34
15879-9 Maria 27
1001-8 Laura 21

tabla "personas_antiguas"

id_cod ver nombre edad
12478 1 Oscar 30
11499 6 Pablo 28
1470 0 Miguel 34

una vez ejecutado el insert debiese quedar asi:

tabla "personas_antiguas"

id_cod ver nombre edad
12478 1 Oscar 30
11499 6 Pablo 28
1470 0 Miguel 34
14710 1 Jose 55
15879 9 Maria 27
1001 8 Laura 21

como pueden ver, el registro "1470-0 Miguel 34" no se agrego por que ya existia, y el registro "15879-9 Maria 27" solo se agrego una vez, el unico PK es el id_cod de la tabla "personas_antiguas".

Gracias
  #24 (permalink)  
Antiguo 01/07/2010, 17:39
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Hola amigos, bueno siguiendo y siguiendo dar en la solucion, lo q mas se acerca es esto, pero ahora me da un mensaje que no puedo convertir el texto en int, lo peor de todo es que no se donde. Lo que tengo claro es q no es en el Insert, por que si solo ejecuto desde el primer select en adelante me arroja el mismo error

el codigo es este:

Cita:
INSERT INTO [Movimiento_Personas].[dbo].[personas_antiguas] ([id_Cod]
,[verif]
,[edad])
SELECT CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod)))
,SUBSTRING(N.cod,CHARINDEX('-', N.cod)+1,LEN(N.cod))
,N.edad
FROM [Movimiento_Personas].[dbo].[personas_nuevas] N
WHERE not EXISTS(SELECT id_cod
FROM [Movimiento_Personas].[dbo].[personas_antiguas]
WHERE id_cod = CONVERT(INT,SUBSTRING(N.cod,0,CHARINDEX('-', N.cod))))
and id_cod not in (select CONVERT(INT,SUBSTRING(A.cod,0,CHARINDEX('-', A.cod)))
from [Movimiento_Personas].[dbo].[personas_nuevas] A
group by CONVERT(INT,SUBSTRING(A.cod,0,CHARINDEX('-', A.cod)))
having count (*)>1)
y el mensaje de error es este

Cita:
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value '69873-4' to data type int.
(es el primer registo de la tabla "personas nuevas")

Estare atento a su ayuda, a sus opiniones y comentarios

Saludos
  #25 (permalink)  
Antiguo 02/07/2010, 07:46
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Ayuda con un Cursor

Probaste el ultimo query que te pase?
Los registros repetidos son siempre como el caso de Maria en la tabla personas_nuevas?
Si es asi, entonces deberia funcionar con un simple DISTINCT.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #26 (permalink)  
Antiguo 02/07/2010, 10:42
 
Fecha de Ingreso: junio-2010
Mensajes: 25
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Ayuda con un Cursor

Hola amigo flaviovich, efectivamente, los repetidos serian como el registro donde esta maria, y con tu query me aparece el Siguiente error:


Cita:
The Multi-part identifier "N.cod" could not be bound
The Multi-part identifier "N.cod" could not be bound
The Multi-part identifier "N.cod" could not be bound
The Multi-part identifier "N.cod" could not be bound
The Multi-part identifier "N.cod" could not be bound
The Multi-part identifier "N.nombre" could not be bound
The Multi-part identifier "N.edad" could not be bound
No column was specified for column 1 of 'N'
No column was specified for column 1 of 'N'
Invalid column name "cod"
Invalid column name "cod"
esta query yo la habia intentado hacer, pero cuando hacia un distinct hacia los campos que quiero ver en la consulta, me buscaba todos los diferentes de cada Columna, entonces igual me repetia los registros

Gracias nuevamente y estoy atento a tu respuesta

Etiquetas: cursor
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:57.