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

Update mediante un While

Estas en el tema de Update mediante un While en el foro de SQL Server en Foros del Web. Que tal, les queria hacer una consulta, talvez a alguno de ustedes les ha pasado, veran estoy haciendo un update mediante un while, el cual ...
  #1 (permalink)  
Antiguo 30/07/2014, 10:58
 
Fecha de Ingreso: mayo-2013
Mensajes: 17
Antigüedad: 8 años, 8 meses
Puntos: 0
Pregunta Update mediante un While

Que tal, les queria hacer una consulta, talvez a alguno de ustedes les ha pasado, veran estoy haciendo un update mediante un while, el cual en esta tabla hay aprox 350000 registros. la cuestion es que segun los calculos que hice cada insert esta tardando aprox 1.8 - 2.5 segundos ya por todos los registros son como 150 horas, alguno me podria decir que estoy haciendo mal?


Código SQL:
Ver original
  1. DECLARE @ciclo      SMALLINT     = 0
  2.     ,@v_xp_codigo       VARCHAR(MAX) = 0
  3.     ,@v_nombre          VARCHAR(MAX) = NULL
  4.     ,@v_ponderacion     VARCHAR(MAX) = 0
  5.     ,@v_id              BIGINT       = 0
  6.    
  7.     WHILE @ciclo = 0
  8.         BEGIN
  9.  
  10.             SELECT TOP 1 @v_xp_codigo = query01.xp_codigo
  11.             ,@v_nombre = query01.nombre
  12.             ,@v_ponderacion = query01.Todos
  13.             ,@v_id = query01.ID
  14.             FROM (
  15.                 SELECT xp_codigo
  16.                 , nombre
  17.                 , Todos
  18.                 , ID
  19.                 FROM #temp_segmentacion WITH(NOLOCK)
  20.             ) AS query01
  21.             WHERE query01.ID > @v_id
  22.             ORDER BY query01.ID ASC
  23.  
  24.             -- Termina Ciclo
  25.             IF @@rowcount=0
  26.             BEGIN
  27.                 SET @ciclo=1
  28.                 --SELECT @ciclo
  29.             END
  30.  
  31.             ELSE -- update
  32.             BEGIN
  33.  
  34.                 DECLARE @i_update nvarchar(MAX)=NULL
  35.                 SELECT @i_update = 'UPDATE #temp_segmentacion
  36.                                     SET [' +@v_nombre+ '] = '+@v_ponderacion+'
  37.                                     WHERE xp_codigo = ' + @v_xp_codigo
  38.                 EXECUTE sp_executesql  @i_update
  39.  
  40.             END        
  41.         END


alguna forma de optimizar esta consulta o alguna solucion?

muchas gracias por su ayuda.

Saludos
  #2 (permalink)  
Antiguo 30/07/2014, 11:15
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 15 años, 5 meses
Puntos: 774
Respuesta: Update mediante un While

que es lo que estas tratando de hacer???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 30/07/2014, 11:15
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 14 años, 6 meses
Puntos: 180
Respuesta: Update mediante un While

Por principio de cuentas, no utilices WITH (NOLOCK)

Segundo, tu UPDATE dinámico, dudo mucho que trabaje

Creo que seria mejor que nos platicaras que deseas hacer y así podríamos recomendarte algo.
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 30/07/2014, 11:36
 
Fecha de Ingreso: mayo-2013
Mensajes: 17
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Update mediante un While

Gracias por responder, veran, tengo lo siguiente:

Código:
ID	|XP_CODIGO	|Todos	|nombre	|Cuentas Nuevas	|Normal	|Vip
1	|13	|9	|Vip	|NULL	|NULL	|NULL
2	|16	|9	|Vip	|NULL	|NULL	|NULL
3	|16	|6	|Normal	|NULL	|NULL	|NULL
4	|18	|9	|Vip	|NULL	|NULL	|NULL
5	|23	|9	|Cuentas Nuevas	|NULL	|NULL	|NULL
6	|25	|9	|Cuentas Nuevas	|NULL	|NULL	|NULL
7	|26	|9	|Vip	|NULL	|NULL	|NULL
8	|27	|9	|Cuentas Nuevas	|NULL	|NULL	|NULL
9	|40	|9	|Vip	|NULL	|NULL	|NULL
10	|43	|9	|Vip	|NULL	|NULL	|NULL
11	|43	|6	|Normal	|NULL	|NULL	|NULL
la Columna todos es la ponderacion que tengo para cada columna, las columas se agregaron dinamicamente en base al nombre, entonces, lo que tengo que hacer es enviar la ponderacion(Todos) a donde haga match con la columna, es decir si tiene 9 en Todos, agarra VIP y hace update 9 en el id 1

Saludos
  #5 (permalink)  
Antiguo 30/07/2014, 13:02
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 14 años, 6 meses
Puntos: 180
Respuesta: Update mediante un While

Yo no le entendí...sorry

Tal vez, si lees otra vez tu comentario, te darás cuenta que no esta muy claro que digamos
__________________
MCTS Isaias Islas
  #6 (permalink)  
Antiguo 30/07/2014, 14:21
 
Fecha de Ingreso: mayo-2013
Mensajes: 17
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Update mediante un While

Cita:
Iniciado por iislas Ver Mensaje
Yo no le entendí...sorry

Tal vez, si lees otra vez tu comentario, te darás cuenta que no esta muy claro que digamos

Tengo esa tabla, pero debo de enviar lo que esta en la columna Todos a lo que corresponda en la columna, es decir
la columna nombre tiene un un dato que se llama VIP el cual hace match con una columna que se llama VIP, lo que tengo que hacer es enviar el numero que tengo en la columna Todos que haga match con el nombre y la columna, no se si se entiende mas?
  #7 (permalink)  
Antiguo 30/07/2014, 14:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 15 años, 5 meses
Puntos: 774
Respuesta: Update mediante un While

Peras y manzanas por favor....seria mejor si pusieras, tengo esta tabla(ya la pusiste) y quiero que quede esta informacion(como quieres que quede la informacion) y una pequeña explicacion de cual es el camino para llegar a la segunda tabla :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 30/07/2014, 14:56
 
Fecha de Ingreso: mayo-2013
Mensajes: 17
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Update mediante un While

tengo la tabla #temp_segmentacion la cual contenia al principio solo 3 columnas, las cuales son:
ID
xp_codigo
nombre
Todos

luego la data que tenia la columna nombre se transformo en columnas, es decir en ella existia por ejemplo VIP, Cuentas Nuevas, Normal, estos datos se hicieron columnas y ahora la tabla #temp_segmentacion paso a tener estas columnas extra, quedando de la siguiente manera.

ID
xp_codigo
nombre
Todos
VIP
Cuentas Nuevas
Normal

esa es la nueva estructura de mi tabla, ahora lo que necesito hacer es:

recorrer la tabla en busqueda de la columna nombre, y luego tomar el valor de la columna Todos correspondiente a ese nombre, y hacer el update a la columna que haga match con el nombre, les pongo un ejemplo de como deberia terminar la tabla luego del update.

ID |cexp_cod |Todos|nombre |Cuentas Nuevas |Normal |Vip
1 |13 |9 |Vip |NULL |NULL |9
2 |16 |9 |Vip |NULL |NULL |9
3 |16 |6 |Normal |NULL |6 |NULL
4 |18 |9 |Vip |NULL |NULL |9
5 |23 |8 |Cuentas Nuevas|8 |NULL |NULL
6 |25 |8 |Cuentas Nuevas|8 |NULL |NULL
7 |26 |9 |Vip |NULL |NULL |9
8 |27 |8 |Cuentas Nuevas|8 |NULL |NULL
9 |40 |9 |Vip |NULL |NULL |9
10 |43 |9 |Vip |NULL |NULL |9
11 |43 |6 |Normal |NULL |6 |NULL
  #9 (permalink)  
Antiguo 30/07/2014, 15:15
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 15 años, 5 meses
Puntos: 774
Respuesta: Update mediante un While

y para eso un while???? lo puedes hacer con esto:


Código SQL:
Ver original
  1. UPDATE #temp_segmentacion
  2. SET cuentas_nuevas=t1.cuentas_nuevas,
  3. normal=t1.normal,
  4. vip=t1.vip
  5. FROM
  6. (
  7. SELECT id,exp_cod,todos,nombre
  8. CASE WHEN nombre='Cuentas Nuevas' THEN todos END AS Cuentas_nuevas,
  9. CASE WHEN nombre='Normal ' THEN todos END AS Normal ,
  10. CASE WHEN nombre='VIP' THEN todos END AS VIP
  11. FROM  #temp_segmentacion)
  12. AS t1 WHERE #temp_segmentacion.id=t1.id

saludos!!!!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 30/07/2014, 15:23
 
Fecha de Ingreso: mayo-2013
Mensajes: 17
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Update mediante un While

lo que pasa es que las columnas nunca van a ser las mismas, en base a lo que el usuario ingrese, sino si fuera como dices, por eso es que uso el while, para buscar uno por uno el nombre y luego insertarlo en la columna que corresponde.
  #11 (permalink)  
Antiguo 30/07/2014, 15:27
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 15 años, 5 meses
Puntos: 774
Respuesta: Update mediante un While

entonces no estas diciendo todo tu problema aqui lo que podrias hacer es un query dinamico, si siempre va a insertar3 registros y las demas columnas van a ser variables dependiendo del usuario puedes hacerlo con un simple query :)

[offtopic]
Eres desarrollador verdad???
[/offtopic]
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 30/07/2014 a las 15:33
  #12 (permalink)  
Antiguo 30/07/2014, 15:44
 
Fecha de Ingreso: mayo-2013
Mensajes: 17
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Update mediante un While

lo que pasa es que el usuario ingresa Cuentas Nuevas, VIP, o todo lo que el quiera, no siempre van a ser 3, pero en base a lo que el ingrese, en el proceso luego se crean las columnas, puede ser N columnas, el update como mostraba en el query al principio si lo hace, pero esta tardando mucho porque es 1 a 1, entonces queria saber si alguien sabia una forma mas facil de hacer ese update.

en bd no tengo mucha xp
  #13 (permalink)  
Antiguo 30/07/2014, 15:47
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 15 años, 5 meses
Puntos: 774
Respuesta: Update mediante un While

si hay una forma mas facil, pero necesito tener todo el background de lo que quieres hacer si no ni como ayudarte.....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #14 (permalink)  
Antiguo 30/07/2014, 16:21
 
Fecha de Ingreso: mayo-2013
Mensajes: 17
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Update mediante un While

veras tengo un aplicativo en la cual el usuario ingresa los tipos de segmentacion que el quiere, los cuales se maneja por un id(ID), un numero de expediente(xp_codigo), el nombre(nombre) que es el que el usuario ingresa, una ponderacion (Todos, asi le pusieron de nombre).
eso seria basicamente la tabla en donde se inserta, entonces luego para no tocar esta tabla, hago un into #temp_segmentacion para manipularla a como quiera,

el siguiente paso es que agarro la columna NOMBRE que es la que tiene la descripcion de cada segmentacion ingresada por el usuario que puede ser VIP, Normal, Cuentas Nuevas, Morosos, Normal en mora, etc. o lo que el usuario quiera ingresar igualmente recorro con un while la tabla temporal y lo que hago es un alter table y agregar una nueva columna por cada descripcion contenida en la columna NOMBRE(lo que hago es un select distinct nombre from #temp_segmentacion) y solo agrego las columnas.

Ahora esta tabla ya tiene mas columnas que son las siguientes:
ID, xp_codigo, nombre, todos, VIP, Normal, Cuentas Nuevas, Morosos, Normal en mora, etc

ahora en cada uno:

ID: autoincrement
xp_codigo: numero de expediente
nombre: descripcion de la segmentacion ingresada por usuario
todos: Ponderacion asignada a la sementacion
y las nuevas columnas

ahora lo que necesito hacer es nada mas hacer un update a cada columna nueva pero con la ponderacion (todos) de cada descripcion(nombre) a las nuevas columnas existentes que concuerdan o estan amarradas a la columna nombre, lo demas no importa que se quede NULL

este seria ya el ultimo paso, pero como te comentaba esta tardando mucho porque lo estoy haciendo uno a uno
el fin es solo mostrar de ultimo las columnas ID, xp_codigo, nombre y las nuevas columas que ya tienen la ponderacion(update de columna todos)
  #15 (permalink)  
Antiguo 30/07/2014, 16:36
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 15 años, 5 meses
Puntos: 774
Respuesta: Update mediante un While

si ya insertas una columna usando los nombres, porque no en lugar de eso haces un case como el que te mostre??? en lugar de add column seria que armaras el query dinamico con los cases y asi ya no necesitas mas actualizaciones de datos ni nada........te ayudaria pero tengo algunos pendientes en el trabajo :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #16 (permalink)  
Antiguo 31/07/2014, 08:21
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 14 años, 6 meses
Puntos: 180
Respuesta: Update mediante un While

Veo un hoyo del desarrollo (un verso, sin esfuerzo), si dejas que el "usuario" ingrese lo que quiera, entonces puedes llegar a tener puras TONTERIAS.

BIP
NORRMAL
CUENTAS NUEBAS

Y todas las combinaciones que te puedas imaginar, maneja CATALOGOS
__________________
MCTS Isaias Islas

Etiquetas: masivo, tiempo, update
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:37.