jueves, 3 de marzo de 2011

Guía Práctica de Novedades 2008


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

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 :

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