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. >
