Showing posts with label SQL. Show all posts
Showing posts with label SQL. Show all posts

Monday, October 18, 2021

Using MySQL regular expressions in Rails ActiveRecord

Sometimes you want to filter the rows that not follow a given format.

For example, it was my case. I didn't get the rows that follow this format: [0-9]-wordhere

So, I did this:

my_result = MyModel.where("id = 1 AND (my_column NOT REGEXP ? AND my_column NOT REGEXP ?)", "[0-9]-wordone", "[0-9]-wordtwo")

This line will be transleted to:

SELECT * FROM my_table WHERE (id = 1 AND (my_column NOT REGEXP '[0-9]-wordone' AND my_column NOT REGEXP '[0-9]-wordtwo'))

Easy, right?

Happy coding :)


Thursday, February 23, 2017

Case When Else - If Else

Tengo la siguiente programación en Crystal Reports la cual necesité que traducirlo a SQL. Una solución fue como sigue a continuación (3 casos diferentes):

1.


case vIngresoDiario.IdcFormaPago 
 when 6 then
  case when (vIngresoDiario.IdcTipoCuota <> 27 and vIngresoDiario.IdcTipoCuota <> 230) then
   vIngresoDiario.MontoDetalle 
  else 
      ((vIngresoDiario.MontoDetalle) / (( 
     round((vIngresoDiario.PrimaTotal)*100/((vIngresoDiario.PrimaPura)+(vIngresoDiario.Adicionales)+(vIngresoDiario.Impuestos))-100,0) 
     * 0.01) +1)) end
  
 when 7 then
  case when vIngresoDiario.IdcTipoCuota =230 then
   (vIngresoDiario.MontoDetalle) / (vIngresoDiario.Interes * 0.01) +1 
  else
   case when vIngresoDiario.TipoTransp = 5 then
     (vIngresoDiario.MontoDetalle) / (vIngresoDiario.InteresPlanPago * 0.01) +1
   else
     ((vIngresoDiario.MontoDetalle) / (( 
     round((vIngresoDiario.PrimaTotal)*100/((vIngresoDiario.PrimaPura)+(vIngresoDiario.Adicionales)+(vIngresoDiario.Impuestos))-100,0) 
     * 0.01) +1)) end end
 end as  'PRIMA CONTADO'

2.

vIngresoDiario.AgenteBroker as 'AGENTE/BROKER', 
case 
 when vIngresoDiario.Numero  is not null 
 then convert(varchar(10),vIngresoDiario.Numero) + ' F'
 else
  convert(varchar(10), vIngresoDiario.NumeroRecibo) + ' R'
end as 'NRO FACTURA/RECIBO' ,

3.



case when 
 ABS(ROUND(vIngresoDiario.Comision/(vIngresoDiario.PrimaPura+vIngresoDiario.Adicionales-vIngresoDiario.GestionCobranzas)*100,2)-
 (vIngresoDiario.Comision/(vIngresoDiario.PrimaPura+vIngresoDiario.Adicionales-vIngresoDiario.GestionCobranzas)*100)) > 0.05
 then
  (vIngresoDiario.Comision/(vIngresoDiario.PrimaPura+vIngresoDiario.Adicionales-vIngresoDiario.GestionCobranzas)*100)
 else
   ROUND(vIngresoDiario.Comision/(vIngresoDiario.PrimaPura+vIngresoDiario.Adicionales-vIngresoDiario.GestionCobranzas)*100,2)
end as 'PorcComision',

Friday, February 17, 2017

Filtrar fecha sin hora - sql

Situación: Filtrar fecha sin hora.
Las fechas en nuestras tablas registran fecha y hora pero si deseamos consultar todos los datos cuyas fechas sean entre 01 de febrero a 15 de febrero si no le agregamos la hora (15/02/2017 23:59:59), no se filtrarán todos los datos que corresponden al día 15

Solución 1: utilizando el cast (campo as date)

WHERE cast(CTC.Fecha as date) between @pmfechaDesde and @pmfechaHasta

Wednesday, November 23, 2016

Cómo concatenar filas en SQL SERVER

Cómo concatenar filas en SQL SERVER separados por comas y sin coma al final ni al principio? Utilizando STUFF y FOR XML PATH

Ejemplo




(SELECT STUFF((
        SELECT TOP 100 ','+ convert(VARCHAR(10), a.Numero)  
  FROM MANAnexos a WHERE a.Id IN (
  SELECT cuotas.IdAnexo  
  FROM  COBFacturas factura 
  INNER JOIN COBTransaccionesCajas transac ON transac.Id = factura.IdTransaccionCaja 
  INNER JOIN COBCuotasTransacciones cuotastran ON cuotastran.IdTransaccionCaja =transac.Id 
  INNER JOIN COBCuotas cuotas ON cuotas.id=cuotastran.IdCuota  
  WHERE factura.Id = @IDFactura)
       FOR XML PATH('')
),1,1, 'Anexo ')) AS Descripcion

Wednesday, December 11, 2013

Cuántos domingos hay en un rango de fecha - Query

La pregunta es cómo determinar, dado un rango de fechas, cuántos días domingos hay.
SQL Server no tiene una función propia como tal, así que podemos utilizar la siguiente
función la cual le enviamos el rango de fechas. 
 
 
 CREATE FUNCTION fncCuantosDomingosHay (@inicio DATETIME, @fin DATETIME)
  RETURNS integer
  AS
  BEGIN
  DECLARE @dia_sem INT
  DECLARE @domingos INT
  DECLARE @fecha datetime
   
  SET @fecha=@inicio
  SET @domingos=0
  while @fecha <= @fin
  BEGIN    
   SELECT @dia_sem=datepart(weekday,@fecha) 
   IF @dia_sem=1
     SET @domingos=@domingos+1    
   SELECT @fecha=dateadd(dd,1,@fecha)     
  END
  return @domingos
    END


--EJECUTAMOS LA FUNCIÓN

declare @total integer

exec @total= fncCuantosDomingosHay '2013/10/16','2013/11/15'

print @total

--Resultado: 4

Friday, August 30, 2013

Datediff - convertir horas A decimal

Me pidieron saber el tiempo transcurrido en horas dada dos fechas. Fecha hora inicial en la que el Call Center recibió una llamada hasta la hora fecha en la que se dio respuesta a esa llamada.

Fecha Hora inicial: 30/08/2013 07:30:30
Fecha Hora final: 30/08/2013 08:00:00

Dado ese ejemplo, tenemos que transcurrieron 1.51 horas de tiempo. Pero resulta que cuando realizamos alguna división, la función Datediff omite la parte decimal y por tanto el cálculo ya no es exacto.

La siguiente línea de código muestra cómo hacerlo. Cómo convertir horas a decimal utilizando DATEDIFF

declare @start datetime
set @start = '2013-08-29 07:00:00'

declare @end datetime
set @end = '2013-08-29 08:30:30' --getdate() 1,51
select cast(datediff(second, @start, @end) / 3600.0 as decimal (10, 2))


Fácil, ¿no?

Friday, June 28, 2013

Consulta SQL entre 2 servidores distintos

Vaya, qué tragedia que me pasó hoy. Mas bien que no lo hice en el servidor de producción sino en el de test. 

Hice un update sin where y afectó alrededor de 1500 registros jajaj. Haber grabado mi reacción de ese momento. Lo único que me consolaba era que se trataba de una copia de base de datos. Pero de todas maneras esa copia la estamos utilizando más de uno, no solo yo. Y pedir una nueva copia es re-dificil. Mucho trámite. 

Lo que hice fue hacer un insert de los registros de la base de datos del servidor de producción. Le hice un truncate a la tabla y luego el insert. En realidad, hice el truncate a dos tablas y el insert a estas mismas dos ya que es un maestro-detalle. 

Sin embargo, primero hay que agregar el servidor al que queremos acceder desde nuestro servidor. En este caso, yo desde el servidor de test al servidor de producción. Cómo lo hacemos? 

EXEC sp_addlinkedsrvlogin 'NombreDeTuServidor', 'false', NULL, 'UsuarioConElQueTeConectas', 'ContrseniaDeEseUsuario'

Lo ejecutas y ahora estás apto para realizar tu consulta de esta manera:

insert into parametro (spar_id, spar_dom_id, spar_descripcion, iCreateBy, dtCreatedt, iUpdateBy, dtUpdatedt, iEstadoReg, iConcurrency_id, bActivo, bActivoMovil) 
(select * from BOSCZDB00.Boveda.dbo.parametro)

Nota para que puedas acceder a la tabla de otro servidor va de la siguiente manera:

SERVIDOR.BASE_DE_DATOS.ESQUEMA.TABLA

HaPPy CoDiNg!

Wednesday, February 20, 2013

Numerar registros De una consulta con particion

Hay una función SQL que se llama ROW_NUMBER(). Nos permite numerar en orden (ascedente o descendente) las filas o registros de un query sql ejecutado.

Por ejemplo, en un mes mis empleados hicieron sus visitas de mantención a nuestros clientes. Quiero numerar sus visitas.

Visita Empleado Cliente
1 Juan Perez  Empresa001
2 Juan Perez Empresa002
3 Juan Perez EmpresaAAA
4 Juan Perez Empresa951
5 Pedro Palotes Empresa357
6 Pedro Palotes Empresa555
7 Tobias Sanchez EmpresaXYZ
8 Julio Cortez EmpresaQWE

Pero resulta que el ROW_NUMBER está numerando las filas sin hacer alguna distinción. Yo quisiera que se numeren de acuerdo a cierto campo en este caso el empleado. Quedería así...

Visita Empleado Cliente
1 Juan Perez Empresa001
2 Juan Perez Empresa002
3 Juan Perez EmpresaAAA
4 Juan Perez Empresa951
1 Pedro Palotes Empresa357
2 Pedro Palotes Empresa555
1 Tobias Sanchez EmpresaXYZ
1 Julio Cortez EmpresaQWE

Muy bien, para ello utilizamos el "partition by" del ROW_NUMBER... así (parte del SELECT):

  row_number() over (partition by v.id_responsable order by v.fecha asc) as Visita




Había sido sencillo, no?
HaPPy CoDiNg

Friday, January 18, 2013

Registros que se repiten query SQL

Caso: cómo obtener las filas o registros de una tabla cuyos valores (valor de una columna) se repiten.

Me topé con el caso de que en mi tabla de contratos, tenía contratos con el mismo número de contrato el cual sólo debería pertenecerle a un registro (no tenía el constraint de que sea único ya que también se guardan las adendas). Necesitaba saber qué contratos se estaban repitiendo más de una vez para hacerle un seguimiento y saber cómo surgió tal caso.

A través del siguiente query sql resultó bastante útil...

SELECT id_contrato FROM boveda.dbo.Cliente_Contrato  
WHERE fecha_adenda is null and habilitado=1 and nro_contrato in
(
SELECT  nro_contrato FROM boveda.dbo.Cliente_Contrato 
WHERE habilitado=1 and fecha_Adenda is null 
GROUP BY nro_contrato
HAVING COUNT(*) > 1
)


En general, será una consulta anidada con un HAVING el cual podés personalizarlo si querés saber de los registros que se repiten más de 1 vez, más de 2, etc. Para un caso singular, debes cambiar el filtro en el WHERE (desde luego que sí)

Fácil, verdad?

HaPPy CoDiNg =)

Thursday, January 10, 2013

SQL: update con alias

La forma correcta de escribir una sentencia UPDATE utilizando un alias es como sigue:

UPDATE c set c.contrato_id=
w.nro_contrato=c.nro_contrato)
(SELECT DISTINC w.id FROM boveda.com.contrato w WHERE w.tipo_registro=1 and w.nro_contrato='2402/04')
FROM boveda.com.contrato c
WHERE c.tipo_registro=3 and c.nro_contrato='2402/04'

Sencillo después de saber el cómo, no? Yo no lo sabía e insistía que era algo como...

UPDATE    nombre_de_la_tabla    y_aqui_el_alias    SET    y_aqui_el_resto

Friday, October 12, 2012

SQL SERVER 2008: volver Una columna A identity

Recuerdo que en SQL Server 2005 era fácil volver una columna a identity. Solo tenías que hacer clic derecho sobre la columna en el Management Studio, Modificar/Modify y en la ventanita Collumn Properties bajo la propiedad Identity Specification: Yes, Identity Seed: el último ID.

Pero con el SQL SERVER 2008 no se puede. Los pasos para hacerlo serían:

1. Te creas una tabla auxiliar de la que quieres volver identity.

create table Boveda_Auxiliar(
 Cod_Boveda int primary key identity(1,1),
 Cod_Sucursal smallint,
 Descripcion varchar(50),
 Cod_Cobertura int,
 sLastUpdate_id varchar(16),
 dtLastUpdate_dt datetime,
 iConcurrency_id int,
 FechaCreacion datetime,
 Activo bit
)

2. Ponemos el Identity Insert en on


SET IDENTITY_INSERT Boveda_Auxiliar ON

3. Llenamos la tabla auxiliar con los datos insertados en la tabla original.

insert into Boveda_Auxiliar (Cod_Boveda, Cod_Sucursal,Descripcion, Cod_Cobertura,sLastUpdate_id, dtLastUpdate_dt, iConcurrency_id, FechaCreacion, Activo  ) 
select Cod_Boveda, Cod_Sucursal,Descripcion, Cod_Cobertura,sLastUpdate_id, dtLastUpdate_dt, iConcurrency_id, FechaCreacion, Activo from Boveda

5. Ponemos el Identity Insert en off

SET IDENTITY_INSERT Boveda_Auxiliar OFF

6. Eliminamos la tabla Original

drop table Boveda

7. Renombramos la tabla auxiliar con el nombre de la tabla original.

sp_rename 'Boveda_Auxiliar','Boveda'

8. Llevamos la semilla del Identity al último ID

DBCC CHECKIDENT('Boveda', RESEED, select max(Cod_Boveda) from boveda)

Fácil, no? Sí, fácil pero tedioso. No tengo idea por qué no se puede hacer este proceso como en el caso del Sql Server 2005.

HaPPy Coding! =)

Friday, August 3, 2012

Formato fecha dd/MM/yyyy en sqlserver

Si querés hacer un SELECT a una columna de tipo Date o Fecha y querés que únicamente se vea la Fecha (y no la hora) y que sea del formato dd/MM/yyyy, el código sería así:

SELECT convert(char(10), EspecificoDel, 103) as FechaInicio FROM myTable

convert(char(10), NombreColumnaTipoDate, 103) 

 Sencillo pero útil.

 HaPPy CoDiNg :)

Thursday, April 26, 2012

Usar case en claúsula order By

La verdad es que yo nunca he utilizado el CASE dentro de un ORDER BY. Pero hoy aprendí a hacerlo :) Tal vez me sirva más adelante. Aun no he pensado en el beneficio que pueda sacar de esta característica. 

Es sencillo, voy a dejar dos ejemplos. Por si acaso, cogí la primer tabla que vi cuando abrí mi base de datos y la adapté para dicho ejemplo. Todo con fines académicos, no lo veo para implementarlo en la vida real, no este ejemplo, jeje. :) 

(Probado en Microsoft SQL Server 2008)

Con parámetros.
Le mando la columna con la cual se ordenará y si se ordenará de manera ascendente o descendente.

DECLARE @columna varchar(50)
    SET @columna = 'tipo_registro'
    
 DECLARE @orden varchar(4)
    SET @orden = 'ASC'

 DECLARE @mix varchar(55)
    SET @mix = @columna + ':' + @orden

SELECT * FROM com.Contrato WHERE cod_cliente in (29,30)
ORDER BY


 CASE
        WHEN (@mix = 'tipo_registro:ASC')
        THEN tipo_registro
    END ASC,
    CASE
        WHEN (@mix = 'tipo_registro:DESC')
        THEN tipo_registro
    END DESC
 
 

Con condición. 
Ordenará por cierta columna de acuerdo a una condicionante.

SELECT * FROM com.Contrato WHERE cod_cliente in (29,30)
ORDER BY
 CASE
  WHEN cod_cliente=29
  THEN tipo_registro
  END,
 CASE
  WHEN cod_cliente=30
  THEN nro_contrato
  END 

HaPPy CoDiNg =)

Thursday, April 12, 2012

Cómo implementar una base De datos: 6to paso

Y llegó la hora de consultar los datos de las tablas de nuestra base de datos. Este paso es para satisfacer los reportes requeridos por los usuarios. Nuestro interés no solo es almacenar y almacenar datos sino también consultarlos, extraerlos, estudiarlos, etc.

Como sexto paso, utilizaremos la sentencia de consultas del SQL: SELECT.

El SELECT puede ser tan sencillo como complejo. Todo dependerá de los requerimientos, de lo que queremos.

Una regla general para saber si la consulta será una consulta anidada es cuando en el enunciado encontramos dos preguntas. Mi clásico ejemplo es: Quién es el alumno que obtuvo la mejor nota del semestre I/2012? Aquí primero debemos encontrar cuál es la mejor nota del semestre y luego saber qué alumno obtuvo esa nota.

La sintaxis de la instrucción SELECT es:

SELECT [DISTINCT] nombre de las columnas
FROM nombre de la tabla(s)
[WHERE condición de búsqueda]
[GROUP BY nombre de las columnas de agrupamiento]
[HAVING condición de búsqueda para el Group By]
[ORDER BY nombre las columnas de ordenamiento [ASC | DESC]]

Un SELECT mínimo debe ser así:

SELECT * FROM tabla

TIPS

Si hay un GROUP BY, es porque estamos utilizando funciones agregadas en el SELECT.

Puede existir un función agregada en el SELECT sin usar GROUP BY. Pero no puede existir un GROUP BY si existir una función agregada en el SELECT.

En el GROUP BY deben ir todas las columnas que van en el SELECT.

No puede existir un HAVING sin existir un GROUP BY. Puede existir un GROUP BY sin que haya un HAVING.

Existen tres tipos de consultas anidadas. Los SELECTs que van en el SELECT principal, los SELECTs que van en el FROM y los SELECTs que van en el WHERE.

Bueno, esta publicación no pretende enseñarte SQL. En la web hay n manuales para aprender cómo hacer consultas complejas y optimizadas.

Wednesday, April 11, 2012

Cómo implementar una base De datos: 5to paso

Habrán filas en nuestras tablas que ya no se requieran más. Como quinto paso, emplearemos la sentencia DELETE.

1. Delete Simple

Sin especificar una condición, eliminaremos todas las filas de una tabla sin eliminar la tabla

DELETE FROM persona

2. Delete con Condición

Podemos eliminar las filas de una tabla sólo aquellas que cumplan una condición

DELETE FROM presona WHERE fec_nac > '1985/01/01'

Como en todo, también podemos agregarle una consulta anidada el WHERE. Todo es cuestión de creatividad y basado en conocimiento. Nuestro delete puede convertir de algo sencillo a algo muy complejo.

Tuesday, April 10, 2012

Cómo implementar una base De datos: 4to paso

Después de haber hechos los INSERT INTO, es probable que los datos cambien con el tiempo, por tanto, se recurre a la sentencia UPDATE. Esta sentencia llega a ser nuestro cuarto paso.

La sentencia UPDATE puede ser desde lo más sencillo hasta lo más complejo.

1. Update Simple

UPDATE persona
SET fec_nac= '1985/08/20'

En un update simple, actualizamos TODOS los registros de la tabla

2. Update con Condición

UPDATE persona
SET fec_nac= '1985/02/23'
WHERE id=1

En un update con condición, actualizamos únicamente los registros que cumplen esa condición. En el WHERE podemos agregar una condición simple o compleja a través de consultas anidadas. (un SELECT)

3. Update con CASE

Podemos actualizar una tabla de base de datos de acuerdo a distintos casos. Por ejemplo, queremos ponerle un descuento a un producto pero esto lo queremos hacer de acuerdo al precio del producto.

UPDATE producto
SET descuento= CASE
WHEN (precio < 100) THEN precio*0.1
WHEN (precio <=100 AND precio <500) THEN precio*0.2
ELSE descuento=precio*0.3 END

Para utilizar la cláusula CASE, hay dos maneras de hacerlo:

CASE
 WHEN condición THEN resultado_1
 ELSE resultado_2
 END
 CASE la expresión
 WHEN la condición THEN resultado_1
 ELSE resultado_2
 END

La cláusula ELSE se puede omitir pero el resultado será NULL.

Monday, April 9, 2012

Cómo implementar una base De datos: 3er paso

Una vez creada la base de datos, las tablas, es hora de poblarla. Tercer paso: INSERT INTO.

A la hora de realizar un INSERT INTO podemos hacerlos de 3 maneras.

Considérese la siguiente tabla para los ejemplos:

CREATE TABLE persona(
 id int identity(1,1) primary key,
 nombre varchar(20) not null,
 ap_paterno varchar(20) not null,
 ap_materno varchar(20) null,
 fec_nac datetime null,
 direccion varchar(30) not null
)

1. Sin especificar las columnas a insertar (por defecto, todas).

INSERT INTO persona VALUES ('lizzy', 'mendivil', null, null, 'california st #159')

Cuando no especificamos las columnas, éstas deben coincidir con el tipo de datos y la cantidad de columnas que tiene nuestra tabla. Resulta en desventaja ya que si existen valores nulos posibles, éstos debemos registrarlo también llenándolo con "null" (tal como se muestra en el ejemplo) y además si nos equivocamos y no hacemos coincidir con el tipo de datos, la ejecución de la sentencia resultará en error.

Otra desventaja es que dejamos que el compilador trabaje más analizando que los valores y las columnas correspondan.

2. Especificando las columnas a insertar.

INSERT INTO persona (nombre, ap_paterno, direccion) VALUES ('benjamin', 'villarroel', 'florida st #748')

Nótese que después de escribir el nombre de la tabla, entre paréntesis espcificamos las columnas que vamos a insertar con los valores.

3. A partir de un SELECT.

INSERT INTO persona (nombre, ap_paterno, direccion) SELECT nombre, ap_paterno, direccion FROM cliente

Solo debemos asegurarnos que el tipo de datos de la tabla de la cual queremos extraer los datos coincida con el tipo de datos de las columnas de la tabla a la cual queremos insertar los valores. El tipo de datos y el número de columnas.

Nótese que se reemplaza la palabra clave VALUES con la instrucción SELECT.

Nota.- Cuando realizamos un INSERT a una tabla la cual contiene referencia a otra (FOREIGN KEY), debemos asegurarnos que el valor de esa columna PRIMERO exista en la tabla a la cual pertenece, esto es la Integridad de Datos.

Tuesday, January 24, 2012

Concatenar filas en SQL

A veces quisiéramos mostrar en nuestro reporte por cada maestro, un detalle de datos no en filas sino separados por coma. Por ejemplo, en un x contrato están asociados n servicios. Estos servicios están guardados en una tabla mientras que el contrato en sí, está guardado en otra. Por tanto si el contrato tiene asociados más de un servicio, vamos a tener n filas de servicios y con el join vamos a tener la misma n filas de datos del contrato siendo que n-1 están repetidas.

Me dejo entender, no?

La vaina es concatenar filas. Hay muchas formas de hacerlo. Pero la que he usado y me ha favorecido es "FOR XML PATH"

Por ejemplo, la forma más sencilla, un SELECT directo sin JOIN sería así:

SELECT descripcion + ', ' FROM Servicios_Detalle WHERE cod_servicio=1 FOR XML PATH('')

En la consulta se está agrupando en una sola fila todos los ítem que cumplan el Where dado.

Podrás notar que el resultado se vuelve un link.

Y con un JOIN sería así:

SELECT d.cod_servicio, d.descripcion AS maestro,
(SELECT descripcion + ', '  FROM Servicios_Detalle d2 WHERE d2.cod_servicio=d.cod_servicio FOR XML PATH('')) AS detalles
FROM Servicios d

Esta consulta concatena las filas de detalle que pertenezcan a un maestro dado. La cantidad de filas de resultado será la misma cantidad de filas que hay en la tabla maestro. Ya no se repetirán pues todo estará resumido en una sola fila.

HaPPy CoDiNg! =)

Wednesday, December 14, 2011

Case when null

Usamos CASE WHEN THEN para transformar dado un valor a otro, para personalizarlo. Por ejemplo, el típico F: Femenino y M: Masculino. Nuestro Case sería así:

SELECT blah, blah, blah, CASE sexo WHEN 'F' THEN 'FEMENINO' WHEN 'M' THEN 'MASCULINO' ELSE 'GAY?' END AS SEXO

Pero se podría dar el caso en que necesito mostrar al usuario dado un valor está en NULL entonces no se ejecutó alguna acción. Por ejemplo, tengo mi columna AprobadoPor, si está en NULL es porque no se ha aprobado el registro.

Para usar CASE WHEN THEN con valores nulos, es como sigue a continuación (checka que para estos casos, debes usar la palabra reservada Is Null, Is Not Null):

SELECT blah, blah, blah, CASE WHEN cs.AprobadoPor IS NULL THEN 'En espera' ELSE 'Sí' END AS APROBADO 

Thursday, December 1, 2011

Actualizar una tabla mediante Un bucle

Frase del día: "El conocimiento hincha pero el amor edifica"

Sql Server. Cursor. While. Bucle. Update. Loop to update records in sql server. Using While Loop for SQL Server Update.

Si tu tabla está llena de datos y queres actualizar un campo con un dato algo genérico, podemos utilizar los beneficios de los bucles.

Si tu primary key es un correlativo y sabes que va en orden, lo más sencillo sería hacerlo así:

DECLARE @id BIGINT 
SET @id = 1
WHILE @id < 12
BEGIN
update test set descripcion='aquí el dato genérico' where id=@id
SET @id = @id + 1
END

En el caso de que no, entonces sería utilizando cursor. Checka:

DECLARE @id BIGINT
DECLARE myTable CURSOR FOR
SELECT id FROM test
OPEN myTable
FETCH NEXT FROM myTable
INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
update test set descripcion='aquí el dato genérico' where id=@id
FETCH NEXT FROM myTable
INTO @id
END

Es que a mi me tocó hacer algo parecido. Pero no usé ninguno de las dos utilidades, mi caso era un caso especial jeje. Lo tuve que hacer por vb.net no más xD.

HaPPy CoDiNg.