martes, 30 de septiembre de 2014

Receta T-SQL No. 2.2: Recuperar un Valor de la Base de Datos y Almacenarlo en una Variable

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código T-SQL
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

En esta ocasión conoceremos cómo recuperar un valor desde la base de datos y guardarlo en una variable. Los valores obtenidos nos podrá servir, por ejemplo, para realizar otra consulta para filtrar resultados en una cláusula WHERE. Veremos que una de las formas más naturales de obtención estos valores de interés consiste en la especificación de una cláusula que tenga como parte del predicado un valor de llave primaria o de una llave única. De forma rápida introduciremos el uso de la cláusula IF para validar que una consulta retorne únicamente un registro. ¡Empecemos!

1. Problema

Requerimos establecer el valor de una variable a partir de los valores recuperados de un registro.

2. Solución

El primer paso de la solución consiste en declarar una variable y a partir de una consulta recuperar el valor de una columna y almacenarlo en la variable de interés.

3. Discusión de la Solución

Ahora entremos a ver con más detalle los pasos a seguir para realizar para la obtención de un valor generado desde una consulta:

1. Declarar la variable:

DECLARE @NombreVariable Tipo_Dato;

2. Diseñar la consulta para recuperar el valor y asignarlo en la variable

SELECT @NombreVariable = Columna [,...]
FROM Tabla
WHERE ID_UNICO = 'Valor';

3. Usar el valor de la variable:

SELECT @NombreVariable [AS 'Nuevo Nombre Columna'];

En el primer paso lo único que hemos hecho es declarar la variable a través de la palabra DECLARE [2], especificamos el identificador de la variable -@NombreVariable-, seguidamente la asociación de un tipo de dato. En el segundo paso, usamos la variable recién declarada sobre la cláusula SELECT para asignar el valor recuperado por la consulta. Aquí hay que tener en cuenta que el predicado de la cláusula WHERE comprueba un valor contra una columna de llave primaria ID_UNICO. En el tercer paso, volvemos a usar una cláusula SELECT para mostrar el valor almacenado en la variable NombreVariable.



Respecto al segundo paso es importante tener esta advertencia dada en [1]:
Nota acerca del uso de llave primara o llave única
Figura 1. Nota acerca del uso de llave primara o llave única [1].

4. Práctica: Código T-SQL

En este primer ejemplo declararemos dos variables para contener las dos direcciones (columnas AddressLine1, y AddressLine2) de un una persona (tabla Dirección) con ID de dirección 53 (AddressID):

DECLARE @Direccion1 nvarchar(64);
DECLARE @Direccion2 nvarchar(64);

SELECT @Direccion1 = AddressLine1, @Direccion2 = AddressLine2
FROM Person.Address
WHERE AddressID = 53;

SELECT @Direccion1 AS 'Dirección No 1.', @Direccion2 AS 'Dirección No. 2';


Declaramos las variables @Direccion1, y @Direccion2; a continuación escribimos la consulta T-SQL para recuperar la dirección con ID igual a 53. Del registro recuperado, usamos los valores de las columnas AddressLine2, y AddressLine2 para almacenarlos en las variables @Direccion1, y @Direccion2, respectivamente. Al final, a través de la cláusula SELECT, mostramos los valores almacenados en las variables mencionadas. En la Figura 2 se muestran los resultados de esta consulta:
Resultado consulta valores de variables
Figura 2. Resultado consulta valores de variables.
Para este segundo ejemplo, usaremos la variable global @@ROWCOUNT [3] para validar que la consulta retorna solo un registro. Adicional a este caso, asignaremos valores iniciales a las variables en caso de que la consulta no retornara ningún valor:

DECLARE @Direccion1 nvarchar(64) = '5379 Treasure Island Way';
DECLARE @Direccion2 nvarchar(64) = '# 14';

SELECT @Direccion1 = AddressLine1, @Direccion2 = AddressLine2
FROM Person.Address
WHERE AddressID = 49861;

IF @@ROWCOUNT = 1
SELECT @Direccion1 AS 'Dirección No 1.', @Direccion2 AS 'Dirección No. 2'
ELSE
SELECT 'La consulta no retorno ningún registro o una cantidad superior a 1.';


A las variables @Direccion1, y @Direccion2 asignamos valores de inicialización. En la consulta pretendemos encontrar los datos de las dos direcciones para el ID de dirección -AddressID- igual a 49861. Más adelante, con la sentencia IF comprobamos que el número de registros devueltos por la consulta previa sea igual a 1. De ser así, se mostrarán los valores de las variables @Direccion1, y @Direccion2; en caso contrario, se mostrará el mensaje de advertencia en la sentencia ELSE. Resultado de estas operaciones en la Figura 3:
Resultado consulta valores de variables y validación de número de registros
Figura 3. Resultado consulta valores de variables y validación de número de registros.

5. Conclusiones

Hemos comprendido los básicos para la declaración de variables y asignación de valores por defecto. Estas variables pueden ser usadas como contenedores de valores de columnas generadas por una consulta. Para validar el número de registros que retorna una consulta, usamos la variable global @@ROWCOUNT en conjugación con la sentencia IF. En la próxima receta T-SQL, conoceremos más acerca de la sentencia IF...THEN...ELSE.

6. Glosario

  • Columna
  • Consulta
  • Llave primaria
  • Llave única
  • Sentencia
  • T-SQL
  • Variable

7. Literatura & Enlaces

[1]: SQL Server 2012 T-SQL Recipes - A Problem-Solucion Approach by Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield. Copyright 2012 Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield, 978-1-4302-4200-0.
[2]: DECLARE @local_variable (Transact-SQL) - http://msdn.microsoft.com/en-us/library/ms188927.aspx
[3]: @@ROWCOUNT (Transact-SQL) - http://msdn.microsoft.com/en-us/library/ms187316.aspx
[4]: Receta T-SQL No. 2-1: Declaración de Variables | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/09/receta-t-sql-no-2-1-declaracion-de-variables.html


J

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.