No sean "talibanes anticursores". Las cosas no son siempre blanco y negro.
Ya hubo aca en el foro una discusion donde el cursor era muchisimo mas
eficiente.
Ovbviamente era un caso muy particular.

Creo que en este caso puede que no lo sea y en terminos generales la
recomendacion es NO USAR cursores, pero debemos tomar en cuenta la
naturaleza del problema, el entorno, el numero N de casos a aplicar y las
alternativas, tanto en eficiencia como en complejidad de la solucion y donde
es conveniente resolverlo.

Para pensar:
El orden de complejidad de los algoritmos es importante dependiendo del
numero de casos N.
Recuerden por ejemplo que el bublesort es tan eficiente como el quicksort si
N es pequeño.

Gracias Alejandra.

Saludos


--------------------------------
Atte.
Ing. Jose Mariano Alvarez
SQL Total Consulting


2008/8/8 Maxi accotto <[EMAIL PROTECTED]>

>  Hola, no entiendo tu ultima parte! Asi como lo armaste no se esta
> reiniciando el numero, fijate en la sentencia que tenes algo 
> <partition_by_clause
>
>
>
>
> * *
>
> *Maximiliano Damian Accotto*
>
> *Microsoft MVP en SQLServer*
>
> *SQL Total Consulting***
>
> *Bogota 3631 P3B*
>
> *1407 Buenos Aires-Argentina*
>
> *Movil: (011)-15-5868-5599***
>
> *Desde el exterior: (+54-911)-5868-5599*
>
> [EMAIL PROTECTED]<[EMAIL PROTECTED]>
> *
>
>
>
> *De:* [email protected] [mailto:[EMAIL PROTECTED] *En nombre de *Programacion
> Naldo Lombardi SA
> *Enviado el:* viernes, 08 de agosto de 2008 03:58 p.m.
>
> *Para:* MAXI
> *Asunto:* [dbadmin] Como hacer una iteracion
>
>
>
> Hola!, para que se entienda mejor y quieran probar, les dejos lo siguiente
> duda. Si bien, y gracias a los consejos de mxi,
>
> avance un poco bastante, pero no me cierra la lógica que toma la sentencia.
>
>
>
> /* COPIAR DESDE AQUI*/
>
>
>
> /*colocar todo este texto desde el analizador de consulta */
>
>
>
> /*crear tabla de prueba*/
>
> USE [master]
>
> GO
>
> SET ANSI_NULLS ON
>
> GO
>
> SET QUOTED_IDENTIFIER ON
>
> GO
>
> CREATE TABLE [dbo].[T1](
>
>                 [c1] [int] NULL,
>
>                 [c2] [int] NULL
>
> ) ON [PRIMARY]
>
>
>
>
>
> /*inserten estos registros como prueba */
>
> 110         null
>
> 110         null
>
> 110         null
>
>
>
> 120         null
>
> 120         null
>
>
>
> 130         null
>
> 130         null
>
> 130         null
>
> 130         null
>
>
>
>
>
>
>
> /* sentencia sobre la tabla de prueba*/
>
> update T1
>
>  set T1.c2= substring(cast(p.c1 as nchar(3)),1,2)  +  CAST(RN AS nchar(3) )
>
>
> from (
>
> select c1,ROW_NUMBER() OVER(ORDER BY c1 DESC) AS RN
>
> from dbo.T1
>
> where c1=130
>
> ) as p
>
> where T1.c1=130
>
>
>
>
>
>
>
>
>
> /* la salida del select interno es */
>
> select c1,ROW_NUMBER() OVER(ORDER BY c1 DESC) AS RN
>
> from dbo.T1
>
> where c1=130
>
> /*SALIDA :
>
> 130         1
>
> 130         2
>
> 130         3
>
> 130         4
>
> */
>
>
>
>
>
>
>
> /*select para consulta*/
>
> select * from T1
>
>
>
> /*salida con el filtro de busqueda para los 130*/
>
>
>
> /*
>
> SALIDA:
>
>
>
> 130         131
>
> 130         134
>
> 130         131
>
> 130         134
>
>
>
> EL ERROR corresponde a que agrega  el ultimo (1) y el primero(5).
>
>
>
> alguna idea ?, que estoy haciendo mal?!
>
> */
>
>
>
>
>
> /* HASTA ACA*/
>
>
>
> Maxi Accoto, FELIZ CUMPLEANIO ¡
>
>
>
> Gracias a todos por las ayudas, ideas, etc. !!!
>
>
>
>            Alejandra Blasco
>
>      Departamento de Sistemas
>
>          Naldo Lombardi S.A.
>
>         02362-422039(Int. 201)
>
> [EMAIL PROTECTED]
>  ------------------------------
>
> *De:* [email protected] [mailto:[EMAIL PROTECTED] *En nombre de *Mariano
> Dios
> *Enviado el:* Viernes, 08 de Agosto de 2008 12:35 p.m.
> *Para:* [EMAIL PROTECTED]
> *Asunto:* [dbadmin] Como hacer una iteracion
>
>
>
> Los cursores son costosos a nivel performance. Se recomienda no usarlos,
> intentar resolver la necesidad puntual por otro lado, por ejemplo a través
> de un ciclo y la cláusula WHILE.
>
> Si hablamos de un conjunto de datos pequeño, no hay problema, pero si
> estamos hablando de procesar un lote grande de datos, probas de una manera,
> después de la otra, y los tiempos de respuesta del motor varían de manera
> considerable.
>
> Mariano
>
>  ------------------------------
>
>
> From: [EMAIL PROTECTED]
> To: [EMAIL PROTECTED]
> Subject: [dbadmin] Como hacer una iteracion
> Date: Fri, 8 Aug 2008 11:59:10 -0300
>
> Hola, y cual es la diferencia de hacer eso y usar cursores? Un while a la
> larga es un proceso de cursores, estas pensando en registros y no en teoria
> de conjuntos como son las bases de datos
>
>
>
> * *
>
> *Maximiliano Damian Accotto*
>
> *Microsoft MVP en SQLServer*
>
> *SQL Total Consulting*
>
> *Bogota 3631 P3B*
>
> *1407 Buenos Aires-Argentina*
>
> *Movil: (011)-15-5868-5599*
>
> *Desde el exterior: (+54-911)-5868-5599*
>
> [EMAIL PROTECTED]<[EMAIL PROTECTED]>
> *
>
>
>
> *De:* [email protected] [mailto:[EMAIL PROTECTED] *En nombre de *Mariano
> Dios
> *Enviado el:* viernes, 08 de agosto de 2008 11:02 a.m.
> *Para:* MAXI
> *Asunto:* [dbadmin] Como hacer una iteracion
>
>
>
> Buen día,
>
> la lógica de un cursor se puede reemplazar con la clausula While.
> Podrías insertar los datos a recorrer en una tabla temporal, con una clave
> primaria autonumérica. Despues deberías contar las filas de la tabla
> temporal, y hacer un cliclo hasta que proceses el conjunto de datos. Dentro
> del ciclo, escribirías la funcionalidad que necesites.
>
> Mariano
>  ------------------------------
>
>
> From: [EMAIL PROTECTED]
> To: [EMAIL PROTECTED]
> Subject: [dbadmin] Como hacer una iteracion
> Date: Fri, 8 Aug 2008 09:30:36 -0300
>
> Hola mariano!, gracias por la respuesta, me olvide de comentar  que estoy
> tratando de hacer la sentencia sin usar cursor alguno. Como última de última
> opción, será usar  cursores.  Como "no veo" solución sin cursores, estoy
> consultando en la lista.  Piensan que no es posible una salida a este
> planteo sin recurrir a los cursores?, yo, no le encuentro la vuelta.
>
>
>
> Aclaración, la tabla no tiene índice, mas que la pk
>
>
>
> Desde ya muchas gracias!!
>
>
>
>            Alejandra Blasco
>
>      Departamento de Sistemas
>
>          Naldo Lombardi S.A.
>
>         02362-422039(Int. 201)
>
> [EMAIL PROTECTED]
>  ------------------------------
>
> *De:* [email protected] [mailto:[EMAIL PROTECTED] *En nombre de *Jose
> Mariano Alvarez
> *Enviado el:* Jueves, 07 de Agosto de 2008 08:52 p.m.
> *Para:* [EMAIL PROTECTED]
> *Asunto:* [dbadmin] Como hacer una iteracion
>
>
>
> Yo usaria un cursor del tipo FOR UPDATE.
>
> Ojo con los indices.
>
> .
>
>
> --------------------------------
> Atte.
> Ing. Jose Mariano Alvarez
> SQL Total Consulting
>
>
>
>
>
>
>
> 2008/8/7 Programacion Naldo Lombardi SA <
> [EMAIL PROTECTED]>
>
> Necesito hacer que el campo de la tabla t1 que originalmente tiene esos
> valores termine con los valores
>
> de Salida
>
> la tabla t1, tiene un campo c1 (int), no PK, ni FK.
> Ejemplo con algunos registros:
> C1
> -------
> 110
> 110
> 110
> 120
> 120
> 130
> 140
> 140
> 140
>
>
> Salida:
> C1
> -------
> 11*1*
> 11*2*
> 11*3*
> 12*1*
> 12*2*
> 13*1*
> 14*1*
> 14*2*
>
>
> Quiere decir que encontramos tres 110, entonces necesito iterar el ultimo
> carcater del 110 de 1 a 3,agregando el 1 en el primer, el 2 en el segundo y
> 3 en el tercer registro. O sea, el primer registro 110 paso a ser 111,el
> segundo registro 110 paso a ser 112 , el tercer registro 110 paso a ser 113.
>
> Necesito hacer un script que me permita actualizar esos registros con esa
> iteración
>
> Espero me entiendan. Desde ya muchas gracias.
>
>
>
>            Alejandra Blasco
>      Departamento de Sistemas
>          Naldo Lombardi S.A.
>         02362-422039(Int. 201)
> [EMAIL PROTECTED]
>
>
>
>
> No virus found in this outgoing message.
> Checked by AVG.
> Version: 7.5.524 / Virus Database: 270.5.12/1597 - Release Date: 07/08/2008
> 05:54 a.m.
>
>
>
>
>
> No virus found in this incoming message.
> Checked by AVG.
> Version: 7.5.524 / Virus Database: 270.5.12/1599 - Release Date: 07/08/2008
> 08:49 p.m.
>
>
> No virus found in this outgoing message.
> Checked by AVG.
> Version: 7.5.524 / Virus Database: 270.5.12/1599 - Release Date: 07/08/2008
> 08:49 p.m.
>  ------------------------------
>
> Entra en contacto con el atleta que hay en ti. Haz la 
> prueba.<http://yourinnerathlete.windowslive.com/?locale=es-ar&TXT_TAGLM_WLYIA_takequiz_ar>
>
>
>  ------------------------------
>
> Descargá ya gratis y viví la experiencia Windows Live. Descubre Windows
> Live <http://www.descubrewindowslive.com/latam/index.html>
>
>
>
> No virus found in this incoming message.
> Checked by AVG.
> Version: 7.5.524 / Virus Database: 270.5.12/1599 - Release Date: 07/08/2008
> 08:49 p.m.
>
>
>
> No virus found in this outgoing message.
> Checked by AVG.
> Version: 7.5.524 / Virus Database: 270.5.12/1599 - Release Date: 07/08/2008
> 08:49 p.m.
>

Responder a