SQL Server: 5 Scripts utiles entrega I

A continuación muestro un conjunto de sentencias de SQL server que me han resultado muy interesantes y por supuesto muy útiles. Son scripts muy sencillos pero veras que te resultaran muy útiles si ha diario haces desarrollos con bases de datos, ho igual los puedes tener como referencia por si en algún momento los necesitas.

A continuación muestro el script que use para crear la tabla usada en los scripts.

CREATE TABLE [dbo].[tbl_usuarios](
	[id_Usuario] [bigint] IDENTITY(1,1) NOT NULL,
	[tx_nombre1] [varchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
	[tx_correo] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
	[tx_genero] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 CONSTRAINT [PK_tbl_usuarios] PRIMARY KEY CLUSTERED 
(
	[id_Usuario] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

A continuacion insertamos algunos datos (ficticios) de ejemplo:

INSERT tbl_usuarios (tx_nombre1,tx_correo,tx_genero)
	VALUES ('xavier' ,'xav13r_123@gmail.com' ,'masculino');
INSERT tbl_usuarios (tx_nombre1,tx_correo,tx_genero)
	VALUES ('itzel' ,'itzel5319@gmail.com' ,'femenino');
INSERT tbl_usuarios (tx_nombre1,tx_correo,tx_genero)
	VALUES ('daniel' ,'daniil26@gmail.com' ,'masculino');
INSERT tbl_usuarios (tx_nombre1,tx_correo,tx_genero)
	VALUES ('america' ,'america5319@gmail.com' ,'femenino');
INSERT tbl_usuarios (tx_nombre1,tx_correo,tx_genero)
	VALUES ('gonzalo' ,'gonzasilve@gmail.com' ,'masculino');
INSERT tbl_usuarios (tx_nombre1,tx_correo,tx_genero)
	VALUES ('michel' ,'michl5173@gmail.com' ,'femenino');

En este caso no hemos especificado el valor del dato id_usuario porque el dbms lo genera de manera automatica. Como se puede observar los datos que acabamos de insertar son los siguientes:

id_Usuario           tx_nombre1      tx_correo                        tx_genero
-------------------- --------------- --------------------------------- --------------------
1                    xavier          xav13r_123@gmail.com              masculino
2                    itzel           itzel5319@gmail.com               femenino
3                    daniel          daniil26@gmail.com                masculino
4                    america         america5319@gmail.com             femenino
5                    gonzalo         gonzasilve@gmail.com              masculino
6                    michel          michl5173@gmail.com               femenino

(6 filas afectadas)

Resetear campo auto incrementable

La siguiente sentencia permite establecer el siguiente valor a generarse en un campo tipo auto incrementable. Por ejemplo, si queremos que la siguiente vez que insertemos un registro en la tabla (tbl_usuarios), el id_usuario que se genere sea el 10, entonces escribimos:

DBCC CHECKIDENT('tbl_Usuarios', RESEED, 9) ;

--...respuesta del dbms:
--  Comprobación de información de identidad: valor de identidad actual '6', valor de columna actual '9'.
--  Ejecución de DBCC completada. Si hay mensajes de error, consulte al administrador del sistema.

Ahora para comprobar, insertamos otro registro mas:

INSERT tbl_usuarios (tx_nombre1,tx_correo,tx_genero)
	VALUES ('Patricia' ,'patygml53@gmail.com' ,'femenino');
--Hacemos una consulta de todos los registros:
select * from tbl_usuarios;

Podemos observar que el id del nuevo registro ha sido el que queriamos (el 10):

id_Usuario           tx_nombre1      tx_correo                        tx_genero
-------------------- --------------- --------------------------------- --------------------
1                    xavier          xav13r_123@gmail.com              masculino
2                    itzel           itzel5319@gmail.com               femenino
3                    daniel          daniil26@gmail.com                masculino
4                    america         america5319@gmail.com             femenino
5                    gonzalo         gonzasilve@gmail.com              masculino
6                    michel          michl5173@gmail.com               femenino
10                   Patricia        patygml53@gmail.com               femenino

(7 filas afectadas)

Esta instrucción es muy útil por ejemplo cuando borramos registros y deseamos que los id de los nuevos registros sigan siendo consecutivos.

Obtener el ultimo Id insertado en una tabla

A veces, cuando estamos escribiendo un programa, necesitamos saber cual es el ultimo id mas alto que se ha insertado o generado dentro de una tabla. El siguiente script te permite obtener dicho dato.

--Forma 1
select IDENT_CURRENT('tbl_usuarios') as i_UltimoId

--Forma 2
select top 1 id_usuario as i_UltimoId from tbl_usuarios
order by id_usuario desc

Como puedes ver la primera forma es a través de la funcion IDENT_CURRENT que SQL Server trae incluida. Usala cuando tengas la seguridad de que no has borrado registros y todos sean consecutivos. La segunda forma en si, solo ordena de mayor a menor (descendente) a la tabla por una columna y hace un top 1 (toma solo una fila) de esa misma columna, obviamente que de antemano debemos saber que columna es la llave primaria; en este caso es la columna id_usuario. Para ambas formas el resultado es el que se muestra a continuacion:

i_UltimoId
--------------------
10

(1 filas afectadas)

Ojo! La funcion IDENT_CURRENT() siempre devuelve el valor actual generado en el campo identidad (llave primaria), de modo que si borramos el registro con id 10 (Patricia) y ejecutamos la instruccion IDENT_CURRENT ésta sigue devolviendo 10 y no 6 como tal vez esperarias. Si quieres que devuelva 6 entonces resetea con la instrucción:

DBCC CHECKIDENT('tbl_Usuarios', RESEED, 6) ;

¿Lo captaste?

Respaldar un tabla creando otra (SELECT-INTO)

Yo le llamo respaldar, pero tu le puedes decir como gustes (por ej. copiar). El punto es que esta forma de crear una nueva tabla es una combinacion de una sentencia insert y una sentencia select. Si quisieramos respaldar todos los datos de la tabla tbl_usuarios, lo hacemos con la siguiente instruccion:

SELECT *
INTO tbl_usuarios_respaldo
FROM tbl_usuarios

Despues de ejecutar la instruccion anterior se ha creado una nueva tabla llamada tbl_usuarios_respaldo exactamente con los mismos datos que la tabla tbl_usuarios. Si gustas, en la parte del select puedes especificar solo las columnas que necesites respaldar. Por ejemplo:

SELECT tx_nombre1, tx_genero
INTO tbl_usuarios_respaldo2
FROM tbl_usuarios

Solo estamos respaldando los campos nombre y genero. Por lo que la tabla tbl_usuarios_respaldo2 tendra solo las columnas indicadas:

tx_nombre1                     tx_genero
------------------------------ --------------------
xavier                         masculino
itzel                          femenino
daniel                         masculino
america                        femenino
gonzalo                        masculino
michel                         femenino
Patricia                       femenino

(7 filas afectadas)

En el script que mostrare a continuación vamos a aprovechar esta misma instrucción para copiar la estructura de una tabla y crear una tabla vacía.

Insertar en una tabla datos de otra tabla (INSERT-SELECT)

Este script te permitirá insertar datos en una tabla pero tomando los datos (a insertar) de otra tabla, con un select. En otras palabras, la forma normal de hacer una insercion en una tabla es especificando los datos con la clausula values. Aqui te muestro otra forma de hacer una insercion, en vez de especificar los datos, especificas una consulta (clausula SELECT) que devolvera los datos que deseas insertar.

Cabe mencionar que la tabla donde se va hacer el INSERT debe existir, venga pues vamos a crearla, escribe el siguiente script y ejecutalo en el dbms:

SELECT id_usuario, tx_nombre1 as tx_nombre,tx_correo as tx_email, tx_genero
INTO tbl_usuarios2
FROM tbl_usuarios
where 1=2

…Nos la hemos ingeniado para crear una tabla vacia; agregamos una condicion que nunca se cumplira (observa la clausula WHERE) y por lo tanto la sentencia anterior solo creara la tabla pero sin datos (el select no devolvera datos por la condicion que agregamos). También observa como en nuestra nueva tabla he cambiado el nombre a algunos campos.

Bien, sigamos, si deseamos copiar todos los usuarios de sexo femenino en la tabla recien creada (tbl_usuarios2), lo hacemos con el siguiente script:

INSERT INTO tbl_usuarios2  (id_usuario, tx_nombre, tx_email)
  SELECT id_usuario, tx_nombre1, tx_correo
  FROM tbl_usuarios
  WHERE tx_genero='femenino';

Ahora la tabla tbl_usuarios2 contiene los datos devueltos por la consulta que esta de la linea 2-4, es decir, contiene lo siguiente:

id_usuario   tx_nombre         tx_email                       tx_genero
------------- ---------------- ------------------------------ --------------------
1            itzel             itzel5319@gmail.com            femenino
2            america           america5319@gmail.com          femenino
3            michel            michl5173@gmail.com            femenino
4            Patricia          patygml53@gmail.com            femenino

(4 filas afectadas)

Observa como se ha generado el Id automaticamente, lo que comprueba que la estructura de las 2 tablas es la misma.

Actualizar campos de una tabla con los datos de otra tabla (UPDATE-FROM)

Este script es muy similar al anterior pero en vez de hacer un INSERT hace una actualizacion (update). Olvida los ejemplos anteriores. Para efectos de prueba vamos a suponer que los datos de la tabla tbl_usuarios2 estan desactualizados y deseamos atualizarlos con datos actualizados, los cuales estan en la tabla tbl_usuarios.

Suponiendo que el Id coincide en ambas tablas. El siguiente script realiza la actualización del nombre y el correo electrónico:

update tbl_usuarios2
set tbl_usuarios2.[tx_nombre]	= tbl_usuarios.[tx_nombre1],
 tbl_usuarios2.[tx_email]		= tbl_usuarios.[tx_correo] 
from tbl_usuarios, tbl_usuarios2
where tbl_usuarios.id_usuario = tbl_usuarios2.id_usuario

…Eso es todo por ahora. Próximamente estaré exponiendo mas ejemplos de SQL; ejemplos que a mi me han sido útiles en proyectos personales y en mis actividades diarias de la oficina.

…y recuerda que siempre es mejor CTRL+N que CTRL+C. Lo que te intento decir es que si realmente quieres aprender no hay nada como practicarlo escribiendo todo y no copiando. Dejame un comentario si te gusto o sirvió ¿vale?, igualmente si tuve algún error tipográfico.

Gracias por tu visita. Saludos cordiales.

Anuncios

Acerca de gonzasilve
Freelance Web Developer.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: