Sei sulla pagina 1di 84

CREANDO OTROS OBJETOS

D E B A S E S D E D AT O S

E S C U E L A T E C N O L Ó G I C A I N S T I T U TO T É C N I C O C E N T R A L
B A S E D E D AT O S I I
RICARDO GIRALDO GÓMEZ
CREANDO OTROS OBJETOS DE BASES
DE DATOS
• TEMAS AVANZADOS DE T-SQL
• VISTAS
• FUNCIONES DEFINIDAS POR EL USUARIO
• LOS PROCEDIMIENTOS ALMACENADOS
• DISPARADORES DE MANIPULACION DE DATOS
T E M A S AVA N Z A D O S D E T- S Q L
AGREGACIONES, VENTANAS 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.
EJECUTANDO AGREGACIONES

• La función SUM(). que 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.
EJECUTAR UNA SIMPLE AGREGACIÓN
USE AdventureWorks2012;
SELECT
SUM(poh.TotalDue) AS [Total Due],
AVG(poh.TotalDue) AS [Average Total Due],
COUNT(poh.EmployeeID) [Number Of Employees],
COUNT(DISTINCT poh.EmployeeID) [Distinct Number Of Employees]
FROM Purchasing.PurchaseOrderHeader poh
EJECUTANDO AGREGACIONES CON
AGRUPAMIENTOS
• De manera global las agregaciones 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.
EJECUTANDO AGREGACIONES CON
AGRUPAMIENTOS - SINTAXIS
SELECT
FROM
GROUP BY <column1>, <column2>,…
• 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
EJECUTAR AGREGACIONES CON LA
CLÁUSULA GROUP BY
USE AdventureWorks2012;
SELECT sm.Name AS ShippingMethod, SUM(poh.TotalDue) AS [Total Due],
AVG(poh.TotalDue) AS [Average Total Due], COUNT(poh.EmployeeID) AS [Number Of Employees],
COUNT(DISTINCT poh.EmployeeID) AS [Distinct Number Of Employees]

FROM Purchasing.PurchaseOrderHeader poh


INNER JOIN Purchasing.ShipMethod sm ON poh.ShipMethodID = sm.ShipMethodID

GROUP BY sm.Name
USO DE LA CLÁUSULA HAVING

• 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
LIMITANDO FILAS AGREGADAS CON
UNA CLÁUSULA HAVING
USE AdventureWorks2012;
SELECT
sm.Name AS ShippingMethod,YEAR(poh.OrderDate) OrderYear,
SUM(poh.TotalDue) AS [Total Due],
AVG(poh.TotalDue) AS [Average Total Due], COUNT(poh.EmployeeID) AS [Number Of
Employees],
COUNT(DISTINCT poh.EmployeeID) AS [Distinct Number Of Employees]
FROM Purchasing.PurchaseOrderHeader poh
INNER JOIN Purchasing.ShipMethod sm
ON poh.ShipMethodID = sm.ShipMethodID
GROUP BY sm.Name,YEAR(poh.OrderDate)
HAVING SUM(poh.TotalDue) > 5000000
LIMITANDO FILAS AGREGADAS CON
UNA CLÁUSULA HAVING
EL 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 2012 tiene tres objetos temporales primarios
– Expresiones de tabla comunes
– Las variables de tablas
– Las tablas temporales
EXPRESIONES DE TABLA COMUNES

• 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.
• Los usos típicos de las CTE son para reemplazar las vistas, los datos de grupo, realizar
recursividad, y crear múltiples referencias a una sola tabla.
EXPRESIONES DE TABLA COMUNES -
SINTAXIS
WITH <expression_name> [(column_name [,...n])]
AS
(CTE_query_definition)

• 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.
CREACIÓN Y USO DE UNA EXPRESIÓN
DE TABLA COMÚN
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
CREACIÓN Y USO DE UNA EXPRESIÓN
DE TABLA COMÚN
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.
VARIABLES DE TABLAS - SINTAXIS

DECLARE @local_variable [AS] table


(
[(column_definition) [,...n])]
)
DECLARAR Y UTILIZAR VARIABLES
DE TABLA
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
SELECT ep.EmployeeID, p.FirstName, p.LastName, ep.[TotalDue]
FROM @EmployeePOs ep
INNER JOIN Person.Person p
ON ep.EmployeeID = p.BusinessEntityID
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.
CREAR Y UTILIZAR TABLAS
TEMPORALES
USE AdventureWorks2012;
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
SELECT ep.EmployeeID, p.FirstName, p.LastName, ep.[TotalDue]
FROM #EmployeePOs ep INNER JOIN Person.Person p ON ep.EmployeeID = p.BusinessEntityID
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.
MANEJO DE ERRORES DE T-SQL -
SINTAXIS
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.
• Esto se aplica a los bloques tanto en el try y catch.
• Los bloques try y catch se deben construir juntos.
MANEJO DE ERRORES DE T-SQL -
SINTAXIS
• Microsoft SQL Server 2012, introdujo la instrucción THROW, lo que plantea una excepción y
transfiere la ejecución al bloque CATCH.

THROW [ { error_number | @local_variable },


{ message | @local_variable },
{ state | @local_variable }
] [ ;]
IMPLEMENTAR EL MANEJO DE ERRORES
UTILIZANDO CONSTRUCCIONES DE T-SQL

BEGIN TRY
SELECT 1/0;
END TRY
BEGIN CATCH
THROW 51000, 'You divided my ZERO!!!', 1;
END CATCH
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
PALABRAS CLAVES EN EL CONTROL DE
FLUJO
– 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
UTILIZANDO EL BLOQUE BEGIN ... END

USE AdventureWorks2012;
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…ELSE - SINTAXIS

IF Boolean_expression { sql_statement | statement_block }


[ ELSE { sql_statement | statement_block } ]
UTILIZANDO EL BLOQUE IF ... ELSE

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

WHILE Boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
UTILIZANDO EL BUCLE WHILE CON
BREAK Y 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
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
QUÉ SON LAS VISTAS?

• 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 VISTA CON SSMS Y T-SQL

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
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.
REQUISITOS PARA LA TABLA
REFERENCIADA
• 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.
REQUISITOS PARA LA TABLA
REFERENCIADA
USE AdventureWorks2012;
GO
SELECT COLUMNPROPERTY( OBJECT_ID('Sales.SalesOrderDetail'),'LineTotal'
,'IsDeterministic')AS 'Column Length';
GO
• Además de ser determinista, también puede ser necesario marcar la columna como PERSISTED.
Esto depende de si el tipo de datos es impreciso. Los tipo de datos float o real se considera
imprecisa y no puede ser una clave de un índice a menos que se marquen como PERSISTED.
• Por último, las opciones ANSI_NULLS y QUOTED_INDENTIFIER deben haberse establecido en
verdadero cuando se creen las tablas de referencia.
REQUISITOS PARA VISTAS
INDIZADAS
• Las siguientes opciones SET deben estar en ON:
– ANSI_NULLS
– ANSI_PADDING
– ANSI_WARNINGS
– ARITHABORT
– CONCAT_NULL_YIELDS_NULL
– QUOTED_IDENTIFIER
• La opción NUMERIC_ROUNDABORT se debe establecer en OFF.
• Antes de crear la vista, debe configurar estas opciones.
• A continuación, debe comprobar que la vista es determinista.
• Al crear la vista, debe utilizar la opción WITH SCHEMABINDING, que se une la vista al esquema de las tablas subyacentes.
• Por último, el primer índice debe ser un índice UNIQUE CLUSTERED
CREAR UNA VISTA INDIZADA

USE AdventureWorks2012; --Cree la vista


GO CREATE VIEW Purchasing.vwPurchaseOrders
--- Defina las opciones para apoyar las vistas indizadas WITH SCHEMABINDING
SET NUMERIC_ROUNDABORT OFF; AS
SET ANSI_PADDING, ANSI_WARNINGS,
CONCAT_NULL_YIELDS_NULL, ARITHABORT, SELECT

QUOTED_IDENTIFIER, ANSI_NULLS ON; poh.OrderDate, pod.ProductID, SUM(poh.TotalDue) TotalDue,


COUNT_BIG(*) POCount
GO
FROM Purchasing.PurchaseOrderHeader poh
--Compruebe si ya existe una vista con el mismo nombre
INNER JOIN Purchasing.PurchaseOrderDetail pod
IF(OBJECT_ID('Purchasing.vwPurchaseOrders')) IS NOT NULL
DROP VIEW Purchasing.vwPurchaseOrders ON poh.PurchaseOrderID = pod.PurchaseOrderID
GROUP BY poh.OrderDate, pod.ProductID

GO GO
CREAR UNA VISTA INDIZADA
--Add a unico indice agrupado
CREATE UNIQUE CLUSTERED INDEX
CIX_vwPurchaseOrders_OrderDateProduct
ID
ON Purchasing.vwPurchaseOrders(OrderDate,
ProductID)
FUNCIONES DEFINIDAS POR
EL USUARIO
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 2012 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.
FUNCIONES DEFINIDAS POR EL
USUARIO
• 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.
ENTENDIENDO LAS FUNCIONES
ESCALARES DEFINIDAS POR EL USUARIO
• Una función escalar definida por el usuario es una rutina que devuelve un solo valor.
• Estas funciones se utilizan a menudo para centralizar la lógica de un cálculo complejo que
puede ser utilizado por varios otros recursos de base de datos o de aplicaciones.
FUNCIONES ESCALARES DEFINIDAS
POR EL USUARIO - SINTAXIS
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type
[ = default ] [ READONLY ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[;]
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.
PARAMETRIZACIÓN DE FUNCIONES

-- 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
CREAR, MODIFICAR Y QUITAR UNA
FUNCIÓN ESCALAR DEFINIDA POR EL
USUARIO
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Autor: ETITC
-- Fecha de Creación : 9/4/2015
-- Descripcion: Función escalar que sera usada para retornar la edad de los Empleados
-- =============================================
CREAR, MODIFICAR Y QUITAR UNA
FUNCIÓN ESCALAR DEFINIDA POR EL
USUARIO
CREATE FUNCTION dbo.GetEmployeeAge
(
@BirthDate datetime
)
RETURNS int
AS
BEGIN
-- Declare aqui la variable de retorno
DECLARE @Age int
-- Adicionar sentencia T-SQL Para calcular el valor de retorno
SELECT @Age = DATEDIFF(DAY, @BirthDate, GETDATE())
-- Retorna el resultado de la función
RETURN @Age
END
GO
CREAR, MODIFICAR Y QUITAR UNA
FUNCIÓN ESCALAR DEFINIDA POR EL
USUARIO
USE AdventureWorks2012;
SELECT TOP(10)
p.FirstName, p.LastName, e.BirthDate,
dbo.GetEmployeeAge(BirthDate) EmployeeAge
FROM HumanResources.Employee e
INNER JOIN Person.Person p
ON e.BusinessEntityID = p.BusinessEntityID
LLAMAR A LAS FUNCIONES
ESCALARES USANDO LA PALABRA
CLAVE EXECUTE
USE AdventureWorks2012;
GO
DECLARE @Age int;
EXECUTE @Age = dbo.GetEmployeeAge @BirthDate = '5/26/1972'
SELECT @Age;
Entender las funciones con valores
de tabla

• 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.
FUNCIONES CON VALORES DE TABLA –
SINTAXIS EN LÍNEA
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ = default ] [ READONLY ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH <function_option> [ ,...n ] ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ;]
FUNCIONES CON VALORES DE TABLA –
SINTAXIS MULTISENTENCIA
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ = default ] [READONLY] }
[ ,...n ]
]
)
RETURNS @return_variable TABLE <table_type_definition>
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
[ ;]
CREAR UNA FUNCIÓN CON VALORES
DE TABLA EN LÍNEA
CREATE FUNCTION
USE AdventureWorks2012;
dbo.GetOrderDetails
SET ANSI_NULLS ON (
GO @SalesOrderID int
SET QUOTED_IDENTIFIER ON
)
GO
-- ============================================= RETURNS TABLE
-- AutOr: ETITC AS
-- Create date: 9/4/2015
RETURN
-- Descripcion: Devuelve los ítems para un determinado OrderId
-- =============================================
(
SELECT USE AdventureWorks2012;
sod.SalesOrderID, sod.SalesOrderDetailID, SELECT *
sod.CarrierTrackingNumber, p.Name ProductName, FROM dbo.GetOrderDetails(43659);
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
USO DE LAS FUNCIONES CON
VALORES DE TABLA
• 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)
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.
LOS PROCEDIMIENTOS
ALMACENADOS
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.
BENEFICIOS DE LOS STORE
PROCEDURE
• 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.
TIPOS DE PROCEDIMIENTOS
ALMACENADOS
• Definida por el usuario
• sistema
• temporal
• Extendido definida por el usuario
SITAXIS DE STORED PROCEDURE

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]


[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]
] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]
<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE AS Clause ]
TRABAJAR CON
PROCEDIMIENTOS
ALMACENADOS
USE AdventureWorks2012
CREATE PROCEDURE dbo.PurchaseOrderInformation
AS
BEGIN
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
USO DE LA PALABRA CLAVE
EXECUTE
• Para ejecutar un procedimiento almacenado mediante T-SQL, se utiliza la
palabra clave EXECUTE. La sintaxis es la siguiente:

EXECUTE | EXEC procedure_name [parameter1, parameter2, n…]


EXECUTE | EXEC procedure_name [parameter1, parameter2, n…]
WITH RESULT SETS
(
( [column_definition1, column_definition2, n…])
)
EJECUTAR PROCEDIMIENTOS ALMACENADOS Y
REDEFINIR LOS CONJUNTOS DE RESULTADOS

USE AdventureWorks2012
EXEC dbo.PurchaseOrderInformation
WITH RESULT SETS
(
(
[Purchase Order ID] int,
[Purchase Order Detail ID] int,
[Order Date] datetime,
[Total Due] Money,
[Received Quantity] float,
[Product Name] varchar(50)
)
)
PARAMETRIZACIÓN DE LOS
PROCEDIMIENTOS
ALMACENADOS
• 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.
SINTAXIS DE EJECUCIÓN

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


default, @parameter3 = null
SINTAXIS STORED PROCEDURE CON
PARÁMETROS
USE AdventureWorks2012;
GO
--Crear Procedimiento con parámetro OUTPUT
CREATE PROC dbo.SampleOutput
@Parameter2 int OUTPUT
As
SELECT @Parameter2 = 10
--Ejecutar Procedimiento con parámetro OUTPUT

DECLARE @HoldParameter2 INT


EXEC dbo.SampleOutput @HoldParameter2 OUTPUT
SELECT @HoldParameter2
ELIMINAR PROCEDIMIENTOS
ALMACENADOS

DROP PROCEDURE schema_name.procedure_name


DISPARADORES DE
M A N I P U L A C I Ó N D E D AT O S
DEFINICIÓN

• 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.
TIPOS DE DISPARADORES

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

CREATE TRIGGER [ schema_name . ]trigger_name


ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME
<method specifier [ ; ] > }
<dml_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
<method_specifier> ::=
assembly_name.class_name.method_name
CREACIÓN DE DISPARADORES
BEGIN
DECLARE @modifieddate datetime,
USE AdventureWorks2012; @DepartmentID int
GO SELECT @modifieddate = modifieddate,
CREATE TRIGGER @DepartmentID = departmentid FROM
HumanResources.iCheckModifedDate inserted;
ON HumanResources.Department IF(DATEDIFF(Day, @modifiedDate,
getdate()) > 0)
FOR INSERT
BEGIN
AS
UPDATE HumanResources.Department
SET ModifiedDate = GETDATE()
WHERE DepartmentID = @DepartmentID
END
END
MODIFICANDO TRIGGERS

• Al igual que con todos los demás objetos programables en SQL Server, un disparador sólo se
puede modificar mediante T-SQL. Una situación puede presentarse, en la que tendrá que
cambiar la lógica en el interior del trigger. En lugar de descartar y volver a crear el trigger,
puede utilizar la palabra clave ALTER para modificar rápidamente el trigger
ELIMINAR TRIGGERS

DROP TRIGGER HumanResources.iCheckModifedDate


ACTIVACIÓN Y DESACTIVACIÓN
DE LOS TRIGGERS
USE AdventureWorks2012;
--Desactive un Trigger con T-SQL
DISABLE TRIGGER HumanResources.iCheckModifedDate
ON HumanResources.Department;

--Active un Trigger con T-SQL


ENABLE TRIGGER HumanResources.iCheckModifedDate
ON HumanResources.Department;

Potrebbero piacerti anche