Una pequeña mejora introduce SQL Server 2008 al lenguaje T-SQL respecto de la inicialización y asignación de variables. Cuántas veces hemos deseado escribir código de la siguiente manera:
declare
@fecha datetime = getdate(),
@edad int = 36,
@nombre varchar(100) = Juan;
-- Muestro los valores...
select @fecha, @edad, @nombre
declare
@fecha datetime = getdate(),
@edad int = 36,
@nombre varchar(100) = Juan;
-- Muestro los valores...
select @fecha, @edad, @nombre
Ahora, en SQL Server 2008 es completamente válido.
Veamos esta sintaxis:
-- Incremento i, agrego algo al nombre....
select @edad += 1, @nombre += ' Perez;
-- Muestro los valores...
select @edad, @nombre;
Estos operadores funcionan incluso con sentencias DML y columnas. Veamos la forma de incrementar en 100 la columna de una tabla:
update tabla set columna1 += 100;
o realizar la operación entre dos columnas:
update tabla set columna1 += columna2;
Para la insercion de datos :
Tablas persitentes:
Veamos esta sintaxis:
-- Incremento i, agrego algo al nombre....
select @edad += 1, @nombre += ' Perez;
-- Muestro los valores...
select @edad, @nombre;
Estos operadores funcionan incluso con sentencias DML y columnas. Veamos la forma de incrementar en 100 la columna de una tabla:
update tabla set columna1 += 100;
o realizar la operación entre dos columnas:
update tabla set columna1 += columna2;
Para la insercion de datos :
INSERT INTO Clientes
VALUES('Bernardo', 2, 0),
('Jose', 3, 1)
('Maria', 8, 1)
('Isabella', 5, 0)
Tablas persitentes:
IF EXISTS (SELECT * FROM sys.table_types WHERE name = 'Perros')
DROP TYPE dbo.Perros
CREATE TYPE Perros AS TABLE
(
Nombre NVARCHAR(20) NOT NULL,
Peso INT NULL,
Vacunado BIT NOT NULL
)
GO
DECLARE @Perros AS Perros
INSERT INTO @Perros (Nombre, Peso, Vacunado)
VALUES
('Hachi', 62, 0),
('Lucy', 47, 1),
('Popy', 59, 1),
('Rambo', 42, 1),
('Ranger', 34, 0)
SELECT * FROM @Perros
SELECT * FROM (VALUES
('Hachiko', 62, 0),
('Laica', 47, 1),
('Sunday', 59, 1),
('Peluza', 42, 1),
('Peluche', 34, 0))
AS Perros(Nombre, Peso, Vacuna)
1. Ejercicios con Fecha y Hora
Extraer los nuevos tipos de datos de Fecha y Hora haciendo uso de la función GetDate()
-- Ejemplo con Hora
SELECT CAST(GETDATE() AS TIME(6)) AS 'Hora'
-- Ejemplo con Fecha
SELECT CAST(GETDATE() AS Date) AS 'Fecha'
-- Ejemplo con DateTime2
SELECT CAST(GETDATE() AS DateTime2) AS 'DateTime2'
-- Ejemplo con DateTimeoffset
SELECT CAST(GETDATE() AS DateTimeoffset(7)) AS 'DateTimeOfSet'
-- Comparativa de los tipos de datos
SELECT CAST(GETDATE() AS TIME(6)) AS 'Hora',
CAST(GETDATE() AS Date) AS 'Fecha' ,
CAST(GETDATE() AS DateTime2) AS 'DateTime2',
CAST(GETDATE() AS DateTimeoffset(7)) AS 'DateTimeOfSet'
2. Ejercicios con HearchyID
Almacenar la siguiente estructura en una tabla, haciendo uso del tipo de datos, HierarchyID
-- CREAMOS LA TABLA
CREATE TABLE Organigrama
(Nodo hierarchyID PRIMARY KEY,
Nivel AS Nodo.GetLevel(),
Empleado INT,
Nombre VARCHAR(100),
Titulo VARCHAR(100) )
-- INSERTAR LA RAIZ
INSERT INTO Organigrama
VALUES(hierarchyid::GetRoot(), 16, 'Juan Perez', 'Gerente General')
-- VISUALIZAR EL NODO EN TIPO TEXTO
SELECT Nodo.ToString() AS Nodo_Texto, Nivel, Empleado, Nombre, Titulo FROM Organigrama o
--- INSERTAR EL SIGUIENTE NIVEL
INSERT INTO Organigrama
VALUES( (hierarchyID::GetRoot()).GetDescendant(NULL, NULL),
25, 'Pedro Martinez', 'Gerente de Operaciones' )
-- VISUALIZAMOS LOS NODOS INSERTADOS
SELECT Nodo.ToString() AS Nodo_Texto, Nivel, Empleado, Nombre, Titulo FROM Organigrama o
-- CREAMOS UN PROCEDIMIENTO ALMACENADO
CREATE PROC Agregar_Organigrama(@Jefe INT, @Empleado INT, @Nombre VARCHAR(100), @Titulo VARCHAR(100))
AS
DECLARE @JefeNodo hierarchyID, @EmpleadoNodo hierarchyID
SELECT @JefeNodo = Nodo FROM Organigrama o WHERE o.Empleado = @Jefe
SELECT @EmpleadoNodo = MAX(Nodo) FROM Organigrama WHERE Nodo.GetAncestor(1) = @JefeNodo
INSERT INTO Organigrama
VALUES(@JefeNodo.GetDescendant(@EmpleadoNodo, NULL), @Empleado, @Nombre, @Titulo)
------------------- INSERTAR PRIMER REGISTRO ---------------------
Agregar_Organigrama 25, 12, 'Amanda Juarez', 'Asistente de Gerencia Operaciones';
Agregar_Organigrama 16, 63, 'Mario Torrez', 'Gerente de Mercadeo';
Agregar_Organigrama 63, 5, 'Maria Jiron', 'Ejecutiva de Ventas';
Agregar_Organigrama 16, 71, 'Carlos Aguirre', 'Asistente de Gerencia General';
SELECT Nodo.ToString() AS Nodo_Texto, Nodo, Nivel, Empleado, Nombre, Titulo FROM Organigrama o
Ejercicio 3: Realizar consultas sobre HierarchyID
Aquí una lista de los métodos disponibles en el motor de SQL Server 2008 que dan soporte a HiearchyID:
1. GetAncestor, recibe un entero que permite buscar el ancestro n de un nodo hijo.
2. GetDescendant, devuelve un nodo hijo que es descendiente de su padre.
3. GetLevel , indica el nivel del nodo corriente
4. GetRoot , devuelve el nodo raíz del árbol jerárquico
5. IsDescendantOf, devuelve verdadero o falso dependiendo de si el nodo es un descendiente de su padre
6. Parse, convierte una representación de texto canónica en un HiearchyID
7. Read, interpreta una representación binaria de un HiearchyID
8. Reparent, permite asignar un nuevo padre a un nodo hijo
9. ToString, devuelve una cadena de texto que representa un HierarchyID
10. Write, escribe un HiearchyId en un binario
1. GetAncestor, recibe un entero que permite buscar el ancestro n de un nodo hijo.
2. GetDescendant, devuelve un nodo hijo que es descendiente de su padre.
3. GetLevel , indica el nivel del nodo corriente
4. GetRoot , devuelve el nodo raíz del árbol jerárquico
5. IsDescendantOf, devuelve verdadero o falso dependiendo de si el nodo es un descendiente de su padre
6. Parse, convierte una representación de texto canónica en un HiearchyID
7. Read, interpreta una representación binaria de un HiearchyID
8. Reparent, permite asignar un nuevo padre a un nodo hijo
9. ToString, devuelve una cadena de texto que representa un HierarchyID
10. Write, escribe un HiearchyId en un binario
Basado en estos métodos realicemos consultas sobre nuestra estructura creada.
--- BUSQUEDA DE RELACION JERARQUICA
DECLARE @Empleado hierarchyID
SELECT @Empleado = Nodo
FROM Organigrama o WHERE o.Empleado = 12
SELECT * FROM Organigrama o WHERE @Empleado.IsDescendantOf(Nodo) = 1
--- BUSQUEDA DE HIJOS
DECLARE @Empleado hierarchyID
SELECT @Empleado = Nodo
FROM Organigrama o WHERE o.Empleado = 16
SELECT Nodo.ToString(), * FROM Organigrama o
WHERE Nodo.GetAncestor(1) = @Empleado
No hay comentarios:
Publicar un comentario