Está en la página 1de 33

TEMAS AVANZADOS DE T-SQL

2020
Agregaciones y Agrupamientos

Independientemente de los datos que se almacena, en algún punto, será necesario


adicionar agregaciones de alguna manera en los datos.

Utilizando la sintaxis de T-SQL, puede agregar los datos con una función escalares y
agrupo los datos utilizando la palabra clave GROUP BY para realizar estas
operaciones.

La agregación más común que se realiza es la suma, que suma todos los valores de
un conjunto de datos dado. La suma de los datos es compatible con la función SUM
de T-SQL:

SUM( [ ALL | DISTINCT ] expression)


Ejecutando Agregaciones
La función SUM(). suma todos los valores de un conjunto de datos
dado

La función AVG permite calcular la media de todo el conjunto de


resultados.

La función COUNT cuenta el número de registros, incluyendo valores


duplicados.

La función DISTINCT COUNT, cuenta el número de registro sin incluir


duplicados

La función STDEV, Devuelve la desviación típica estadística de todos


los valores de la expresión especificada
La función VAR, Devuelve la varianza estadística de todos los valores
de la expresión especificada
Ejecutando Agregaciones con
Agrupamiento
De manera global las agregaciones de datos, dentro de un resultado
probablemente no es algo que se ve en el uso regular. Normalmente, los datos se
desglosan o agrupan en categorías o segmentos como el año, territorio, país, o
vendedor. Usando la palabra clave GROUP BY, se puede resumir el resultado
seleccionado fijado por una o más columnas o expresiones.
Las columnas que no son utilizados por una función de agregación que se
muestra en la instrucción SELECT deben incluirse en la cláusula GROUP BY. Sin
embargo, una columna puede ser incluida en la cláusula GROUP BY, pero no en la
instrucción SELECT
La cláusula HAVING se comporta de manera similar a una instrucción WHERE. Sin
embargo, se puede aprovechar la agregación. Se puede utilizar sólo con una
declaración SELECT, y se utiliza típicamente con una cláusula GROUP BY

SELECT
FROM
GROUP BY <column1>, <column2>,…
HAVING <condición>
Uso de Objetos Temporales en SQL Server
Al trabajar con T-SQL, puede encontrar a menudo la necesidad de almacenar
temporalmente un conjunto de datos para su uso posterior.
SQL Server tiene tres objetos temporales primarios
Expresiones de tabla comunes
Las variables de tablas
Las tablas temporales
Expresiones de Tabla Común
Una expresión de tabla común (CTE) es un conjunto de resultados temporales que se
define durante la ejecución de una sentencia SELECT, INSERT, UPDATE, DELETE o CREATE
VIEW.

El CTE está disponible sólo durante la duración de la consulta y no se almacena como


otros objetos de la base de datos.

El uso típico de las CTE son para reemplazar las vistas, los datos de grupo, realizar
recursividad, y crear múltiples referencias a una sola tabla.

WITH <expression_name> [(column_name [,...n])]


AS
(CTE_query_definition)

Inmediatamente después de la definición de CTE, debe emitir una consulta que hace
referencia a la CTE.
T-SQL Programming Interface
expression_name es con lo que se hace referencia a la CTE en la consulta, y se requiere

El listado de la columna es opcional, pero se recomienda; si los nombres de columna en


la definición de la consulta no son únicos, se produce un error al ejecutar la consulta.
Inmediatamente después de la definición de CTE, debe emitir una consulta que hace
referencia a la CTE.
WITH EmployeePOs (EmployeeID, [Total Due])
AS
(
SELECT
poh.EmployeeID,
CONVERT(varchar(20), SUM(poh.TotalDue),1)
FROM Purchasing.PurchaseOrderHeader poh
GROUP BY
poh.EmployeeID
)
SELECT
ep.EmployeeID,
p.FirstName,
p.LastName,
ep.[Total Due]
FROM EmployeePOs ep
INNER JOIN Person.Person p
ON ep.EmployeeID = p.BusinessEntityID
Variables de Tablas
Las variables de tabla se comportan de manera similar a las variables locales.

Se suelen utilizar para almacenar pequeñas cantidades de datos (al menos de 500 filas) y sólo están
disponibles en el ámbito local, función o procedimiento almacenado en el que se han declarado.

DECLARE @local_variable [AS] table


(
[(column_definition) [,...n])] USE [AdventureWorks2016CTP3];
) DECLARE @EmployeePOs AS TABLE
(
EmployeeID int,
TotalDue money
)
INSERT INTO @EmployeePOs
SELECT
poh.EmployeeID,
CONVERT(varchar(20), SUM(poh.TotalDue),1)
FROM Purchasing.PurchaseOrderHeader poh
GROUP BY
poh.EmployeeID
Tablas Temporales
Puede crear tablas temporales locales y globales
Las tablas temporales locales están disponibles en el ámbito de la sesión actual y se eliminan al final de una sesión.
Deben ser prefijados con un signo de numero (#).
Las tablas temporales globales están disponibles para todas las sesiones y se eliminan cuando la sesión que los creó
y que hacen referencia a todas las sesiones se cierran.
Deben ser prefijados, con dos signos de número (##) .
La sintaxis para crear una tabla temporal es exactamente el mismo que para la creación de una tabla tradicional, sino
que debe incluir el signo (s) especificados.
A diferencia de los otros dos objetos temporales, se asigna espacio para tablas temporales.
USE [AdventureWorks2016CTP3];
CREATE TABLE #EmployeePOs
(
EmployeeID int,
TotalDue money
)
INSERT INTO #EmployeePOs
SELECT
poh.EmployeeID,
CONVERT(varchar(20), SUM(poh.TotalDue),1)
FROM Purchasing.PurchaseOrderHeader poh
GROUP BY
poh.EmployeeID
Manejo de Errores de T-SQL
Al igual que con cualquier lenguaje de programación, T-SQL proporciona métodos elegantes para
el manejo de errores y excepciones durante la ejecución.
T-SQL utiliza TRY ... CATCH, similar a Microsoft Visual C #.
Al escribir T-SQL, se coloca el código en el bloque TRY, y si se produce un error, el control se envía
al bloque CATCH.
Dentro del bloque CATCH, se debe adjuntar el código T-SQL que se encargará de los errores

BEGIN TRY
{ sql_statement |statement_block}
END TRY
BEGIN CATCH
[{ sql_statement |statement_block}]
END CATCH

sql_statement es una sola instrucción T-SQL y statement_block es cualquier conjunto o lote de


instrucciones T-SQL.
Palabras Claves en el control de Flujo
La determinación de cuándo y cómo el código debe reaccionar o trabajar juntos es una parte
fundamental de cualquier lenguaje de programación
T-SQL incluye un conjunto de palabras clave que le permiten agrupar una serie de declaraciones
y tomar decisiones en tiempo de ejecución basado en la lógica dentro del código

BEGIN…END
BREAK
CONTINUE
GOTO
IF…ELSE
RETURN
WAITFOR
WHILE
BEGIN … END
El acoplamiento palabra clave BEGIN…. END simplemente envuelve un grupo o serie de
instrucciones T-SQL. Bloques BEGIN ... END se pueden anidar.

BEGIN
{
sql_Statement | statement_block
}
END USE [AdventureWorks2016CTP3];
BEGIN
DECLARE @StartingHireDate datetime = '12/31/2001'
SELECT e.BusinessEntityID, p.FirstName, p.LastName,
e.HireDate
FROM HumanResources.Employee e INNER JOIN
Person.Person p
ON e.BusinessEntityID = p.BusinessEntityID
WHERE HireDate <= @StartingHireDate
END
IF … ELSE
El bloque IF ... ELSE simplemente le dice al lenguaje de programación realizar una instrucción T-SQL o un conjunto de
sentencias si se cumple la condición especificada, o otra instrucción T-SQL o un conjunto de instrucciones si no se
cumple.

El IF puede existir sin el ELSE, pero el ELSE no puede existir sin el IF.

IF Boolean_expression { sql_statement | statement_block }


[ ELSE { sql_statement | statement_block } ]
IF(DATENAME(M, GETDATE())='December')
BEGIN
SELECT 'Tiempo de Vacaciones!!!!' Results
END
ELSE
BEGIN
SELECT 'No está seguro de lo que está pasando ahora :' Results
END
WHILE
WHILE es un mecanismo de bucle sobre la base de una expresión booleana. Siempre y cuando la
expresión se evalúa como verdadero, la sentencia T-SQL especificada o bloque de código se
ejecutará.
Dos palabras clave opcionales, break y continue, pueden incluirse con la palabra clave WHILE para
ayudar en el control de la lógica dentro del bucle.
WHILE Boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
DECLARE @count int = 0
WHILE (@count < 10)
BEGIN
SET @count = @count + 1;
IF(@count < 5)
BEGIN
SELECT @count AS Counter
CONTINUE;
END
ELSE
BREAK;
END
VISTAS

2020
Qué son las Vistas ?
Una vista es un objeto virtual o una tabla cuyo conjunto de resultados se deriva de una consulta.

Es muy similar a una tabla real, ya que contiene columnas y filas de datos.

Una vez que la vista se materializa, o se almacena en el disco, es cuando se indexa.


Filtrar los datos de las tablas subyacentes
Filtrar los datos por motivos de seguridad
Centralizar datos distribuidos a través de varios servidores
Crear un conjunto de datos reutilizable
Las vistas se utilizan a menudo como una capa de abstracción para los desarrolladores de bases de datos. A veces
también se utilizan para proteger los datos de diversas maneras.
Como práctica recomendada, se debe evitar el uso de SELECT * en las vistas
No se debe usar ORDER BY en las vistas, ya que no son válidos; sólo son válidos cuando se utiliza con TOP. En ese caso,
ORDER BY se usa para determinar cuáles registros retorna
Crear Vistas Indizadas
Una vista indizada es diferente de otras vistas ya que se materializa y se almacena en el disco de
la misma manera como una tabla.

Un punto interesante acerca de una vista indizada es que el optimizador de consultas puede
hacer referencia a fin de mejorar el rendimiento, aunque no se hace referencia en la consulta

Esta función está disponible sólo en la edición Enterprise de SQL Server.

Antes de crear una vista indizada, necesita asegurarse de que todas las tablas de referencia
reúnen una serie de requisitos.
• En primer lugar, todas las tablas a las que hace referencia deben estar contenidas dentro de
la misma base de datos.
• Si alguno de columnas calculadas en las tablas base no son deterministas, éstas deben ser
eliminadas. Determinista se define como siempre devolver el mismo valor o conjunto de
resultados.
VISTAS
USE [AdventureWorks2016CTP3];
GO

IF(OBJECT_ID('Purchasing.vwPurchaseOrders')) IS NOT NULL


DROP VIEW Purchasing.vwPurchaseOrders
GO
--Cree la vista
CREATE VIEW Purchasing.vwPurchaseOrders
WITH SCHEMABINDING
AS
SELECT
poh.OrderDate,
pod.ProductID,
SUM(poh.TotalDue) TotalDue,
COUNT_BIG(*) POCount
FROM Purchasing.PurchaseOrderHeader poh
INNER JOIN Purchasing.PurchaseOrderDetail pod
ON poh.PurchaseOrderID = pod.PurchaseOrderID
GROUP BY poh.OrderDate, pod.ProductID
GO
--Add a unico indice agrupado
CREATE UNIQUE CLUSTERED INDEX CIX_vwPurchaseOrders_OrderDateProductID
ON Purchasing.vwPurchaseOrders(OrderDate, ProductID)
Funciones Definidas por el Usuario

2020
Funciones Definidas por el Usuario
Las funciones definidas por el usuario son similares a las funciones en otros lenguajes
de programación.
Microsoft SQL Server le permite crear dos tipos de funciones: escalares y con valores
de tabla
Estas funciones permiten un tipo modular de la programación, donde el código y la
lógica se pueden incluir dentro de la función.
Otras aplicaciones, las rutinas y los objetos de base de datos pueden utilizar la
función.
Este enfoque también permite colocar las normas y la gobernanza en torno a cómo se
desarrolla y se despliega el código.
Las funciones son código T-SQL que puede aceptar parámetros, ejecutar la lógica y
cálculos complejos, y devolver datos.
Las funciones escalares devuelven un solo valor, y las funciones con valores de tabla
devuelven un conjunto de resultados.
Las funciones pueden ser utilizadas como CHECK CONSTRAINST en tablas, por vista,
para definir una columna en una sentencia SELECT, y de muchas otras maneras
Parametrización de Funciones
Un parámetro, en el ámbito de la programación de la función T-SQL, es un valor de entrada que se puede
pasar de la función de llamada en el código.
Un parámetro puede ser ajustado a una constante, una columna de una tabla, una expresión, y otros valores.
Las funciones pueden contener tres tipos de parámetros:
• Entrada: Es el valor pasado en el cuerpo de la función.
• Opcional: Como su nombre lo indica, este parámetro no es necesario para ejecutar la función.
• Predeterminado: Este parámetro indica cuando un valor se asigna al parámetro durante la creación. En
otras palabras, es un valor que se especifica cuando se crea la función.
-- Parametro de entrada
CREATE FUNCTION dbo.Input
@parameter1 int

-- Parametro Opcional
CREATE FUNCTION dbo.Optional
@parameter1 int = NULL

-- Parametro Predeterminado
CREATE FUNCTION dbo.Default
@parameter1 int = 1
Ejemplo de Función
CREATE FUNCTION dbo.GetEmployeeAge
(
-- Add the parameters for the function here
@BirthDate datetime
)
RETURNS int
AS
BEGIN
-- Declare the return variable here
DECLARE @Age int
 
-- Add the T-SQL statements to compute the return value here
SELECT @Age = DATEDIFF(DAY, @BirthDate, GETDATE())
 
-- Return the result of the function
RETURN @Age
END
GO

SELECT dbo.GetEmployeeAge ('5/26/1972')


Entender las Funciones con Valores de Tablas
Funciones con valores de tabla pueden ser de dos tipos:
• En línea
• instrucción múltiple
La función en línea, simplemente devuelve un conjunto de resultados

la función de instrucción múltiple ofrece la posibilidad de incluir lógica dentro del cuerpo de la función.
Una función con valores de tabla se puede utilizar en la misma forma que una tabla o vista se utiliza en una
sentencia SELECT.

Puede hacer join a esta función como si fuera una tabla, o puede insertar los resultados en una variable de
tabla o en una tabla temporal.

SELECT *FROM dbo.GetOrderDetails(43659, DEFAULT, NULL)


Ejemplo de Funciones de Tabla
CREATE FUNCTION dbo.GetOrderDetails
(
-- Add the parameters for the function here
@SalesOrderID int
)
RETURNS TABLE
AS
RETURN
(
-- Add the SELECT statement with parameter references here
SELECT
sod.SalesOrderID,
sod.SalesOrderDetailID,
sod.CarrierTrackingNumber,
p.Name ProductName,
so.Description
FROM Sales.SalesOrderDetail sod
INNER JOIN Production.Product p
ON sod.ProductID = p.ProductID
INNER JOIN Sales.SpecialOffer so
ON sod.SpecialOfferID = so.SpecialOfferID
WHERE
sod.SalesOrderID = @SalesOrderID
)
GO
Limitaciones de las Funciones
No se puede utilizar un bloque TRY ... CATCH dentro de una función.

Una limitación específica a las funciones escalares es que no pueden devolver texto, ntext, image, cursor, o datos
timestamp.

Las funciones definidas por el usuario no se pueden utilizar para modificar el estado de base de datos.

Utilización de funciones en una declaración SELECT podría afectar negativamente al rendimiento de la consulta. Esto es
debido a que la función se llama una vez para cada fila devuelta
Procedimientos Almacenados

2020
Definición de Store Procedure
Los procedimientos almacenados son un conjunto de sentencias SQL (una o más) normalmente agrupados para realizar
una rutina específica

Los procedimientos almacenados se pueden crear en cualquier base de datos definida por el usuario y la base de datos
del sistema, excepto la base de datos de recursos.

Son comparables a las funciones instrucciones múltiples, pero que cuentan con características y flexibilidad que no son
posibles dentro de las funciones.

Ofrecen un mejor rendimiento debido al código compilado


Son fáciles de mantener porque los cambios son centrales en lugar de código en línea.

Dado que las operaciones de bases de datos se pueden realizar dentro de los procedimientos almacenados, que
proporcionan un alto nivel de seguridad
En esencia, los procedimientos almacenados crean un nivel de abstracción para los permisos, en lugar de los derechos
que se conceda al usuario sobre SELECT, INSERT, UPDATE o DELETE, el usuario se puede conceder derechos de ejecución a
un procedimiento almacenado.
Ejemplo de Store Procedure

CREATE PROCEDURE dbo.PurchaseOrderInformation


-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SELECT
poh.PurchaseOrderID, pod.PurchaseOrderDetailID,
poh.OrderDate, poh.TotalDue, pod.ReceivedQty, p.Name ProductName
FROM Purchasing.PurchaseOrderHeader poh
INNER JOIN Purchasing.PurchaseOrderDetail pod
ON poh.PurchaseOrderID = pod.PurchaseOrderID
INNER JOIN Production.Product p
ON pod.ProductID = p.ProductID
END
GO

USE [AdventureWorks2016CTP3]
EXEC dbo.PurchaseOrderInformation
Tipos de Procedimientos Almacenados
Definida por el usuario: Un procedimiento definido por el usuario se puede crear en una base de datos definida por el
usuario o en todas las bases de datos del sistema excepto en la base de datos Resource

Sistema: Los procedimientos del sistema se incluyen con SQL Server. Están almacenados físicamente en la base de datos
interna y oculta Resource y se muestran de forma lógica en el esquema sys de cada base de datos definida por el sistema
y por el usuario

Temporal: Los procedimientos temporales son iguales que los procedimientos permanentes salvo porque se almacenan
en tempdb.

Extendido definida por el usuario: Los procedimientos extendidos le permiten crear sus propias rutinas externas en un
lenguaje de programación como puede ser C.

Para ejecutar un procedimiento almacenado mediante T-SQL,


se utiliza la palabra clave EXECUTE.
Parametrización de los SP
Al igual que las funciones, los procedimientos almacenados pueden incluir parámetros como parte de su
código.

La creación de un procedimiento almacenado con parámetros permite que los programas en las llamadas
pasen valores en el procedimiento.

Los parámetros de los procedimientos almacenados difieren de las funciones en la que puede especificar la
dirección, si se trata de un parámetro de entrada o de salida.

Los procedimientos almacenados pueden tener parámetros opcionales y predeterminados similares a los de
las funciones.

EXEC [dbo].[PurchaseOrderInformation] @parameter1 = 1,


@parameter2 = default, @parameter3 = null
DISPARADORES

2020
Definición de Disparadores
Disparadores de manipulación de datos son conjuntos de instrucciones T-SQL que realizan una acción
específica.

Ellos se refieren a menudo como un tipo especial de procedimiento almacenado.


A diferencia de los procedimientos almacenados, triggers se ejecutan sólo cuando un usuario o una aplicación
intenta modificar datos utilizando Data Manipulation Language (DML). DML incluye inserciones,
actualizaciones y eliminaciones contra las vistas y/o las tablas.
Hay tres tipos: AFTER, INSTEAD OF, y desencadenadores CLR.
Como su nombre lo indica, el desencadenador AFTER se ejecuta después de un evento DML y es la acción
predeterminada para un nuevo trigger, si no se especifica un tipo

Si se ejecuta INSERT en una tabla, el desencadenador INSTEAD OF se ejecutará en el lugar de los comandos
INSERT real. En otras palabras, el insert no se ejecuta y el código dentro de la desencadenador DML se ejecuta
en su lugar, como parte de la operación del trigger
Ejemplo de Trigger

CREATE TRIGGER HumanResources.iCheckModifedDate


ON HumanResources.Department
FOR INSERT
AS
BEGIN
DECLARE @modifieddate datetime, @DepartmentID int
SELECT @modifieddate = modifieddate, @DepartmentID = departmentid FROM
inserted;
IF(DATEDIFF(Day, @modifiedDate, getdate()) > 0)
BEGIN
UPDATE HumanResources.Department
SET ModifiedDate = GETDATE()
WHERE DepartmentID = @DepartmentID
END
END
GO

También podría gustarte