Mejoras en T-SQL para SQL Server 2005

67 %
33 %
Information about Mejoras en T-SQL para SQL Server 2005

Published on May 9, 2007

Author: pabloesp

Source: slideshare.net

Description

Esta presentación nos muestra las características incluidas en el lenguaje T-SQL en SQL Server 2005 y que no estaban en versiones anteriores

Pablo Espada Bueno www.programadorautonomo.net www.esbupa.com

Habitualmente me dedico a impartir formación y a labores de desarrollo y consultoría en .NET Si desea que colabore con usted impartiéndoles una formación o desarrollando algún proyecto, puede contactarme: Web www.programadorautonomo.net www.esbupa.com Email [email_address] [email_address] Espero que les guste la presentación

Habitualmente me dedico a impartir formación y a labores de desarrollo y consultoría en .NET

Si desea que colabore con usted impartiéndoles una formación o desarrollando algún proyecto, puede contactarme:

Web

www.programadorautonomo.net

www.esbupa.com

Email

[email_address]

[email_address]

Espero que les guste la presentación

Nuevos Tipos de Datos Nuevas Características en Indices La palabra reservada OUTPUT Common Table Expressions Operaciones PIVOT y UNPIVOT El operador APPLY Clausula OVER Función RANK Función DENSE_RANK Función ROW_NUMBER Función NTILE Gestión Estructurada de Excepciones

Nuevos Tipos de Datos

Nuevas Características en Indices

La palabra reservada OUTPUT

Common Table Expressions

Operaciones PIVOT y UNPIVOT

El operador APPLY

Clausula OVER

Función RANK

Función DENSE_RANK

Función ROW_NUMBER

Función NTILE

Gestión Estructurada de Excepciones

Creacíon de campos varchar,nvarchar o varbinary con tamaño máximo de hasta 2^31 Bytes El nuevo tipo “xml” permite almacenar documentos de hasta 2 GB CREATE TABLE mySchema.LargeTable (varcharCol varchar(max)) CREATE TABLE mySchema.XMLTable (idCol int, xmlCol xml)

Creacíon de campos varchar,nvarchar o varbinary con tamaño máximo de hasta 2^31 Bytes

El nuevo tipo “xml” permite almacenar documentos de hasta 2 GB

La sentencia ALTER INDEX nos permitirá realizar un conjunto de operaciones básicas sobre índices Deshabilitar un índice. Para rehabilitarlo habrá que recompilarlo o eliminarlo Recompilar un índice Recompilar todos los índices de una tabla ALTER INDEX IX_CustDOB ON Sales.Customer DISABLE ALTER INDEX PK_CustId ON Sales.Customer REBUILD ALTER INDEX ALL ON Sales.Customer REBUILD

La sentencia ALTER INDEX nos permitirá realizar un conjunto de operaciones básicas sobre índices

Deshabilitar un índice. Para rehabilitarlo habrá que recompilarlo o eliminarlo

Recompilar un índice

Recompilar todos los índices de una tabla

Reorganizar (defragmentar) un índice Cambiar cualquier valor establecido en la sentencia CREATE INDEX SQL Server 2005 permite crear índices no agrupados que incluyan campos que no sean clave ALTER INDEX PK_CustId ON Sales.Customer REORGANIZE CREATE NONCLUSTERED INDEX IX_CustomerPostalCode ON Sales.Customer (PostalCode) INCLUDE (AddressLine1, AddressLine2, City)

Reorganizar (defragmentar) un índice

Cambiar cualquier valor establecido en la sentencia CREATE INDEX

SQL Server 2005 permite crear índices no agrupados que incluyan campos que no sean clave

OUTPUT permite volcar los resultados de la ejecución de cualquier sentencia SQL en una variable de tipo “tabla” Esta palabra clave podrá utilizarse en cualquier sentencia DML excepto: INSERT que vayan a insertar datos en vistas Operaciones con tablas/vistas remotas Operaciones en vistas particionadas

OUTPUT permite volcar los resultados de la ejecución de cualquier sentencia SQL en una variable de tipo “tabla”

Esta palabra clave podrá utilizarse en cualquier sentencia DML excepto:

INSERT que vayan a insertar datos en vistas

Operaciones con tablas/vistas remotas

Operaciones en vistas particionadas

Suponiendo una tabla Stock.ProductList con campos ProductID IDENTITY int ProductName nvarchar(100) Price money Veamos algunos ejemplos del uso de OUTPUT con sentencias INSERT, UPDATE y DELETE

Suponiendo una tabla Stock.ProductList con campos

ProductID IDENTITY int

ProductName nvarchar(100)

Price money

Veamos algunos ejemplos del uso de OUTPUT con sentencias INSERT, UPDATE y DELETE

DECLARE @InsertDetails TABLE ( ProductID int, InsertedBy sysname ) INSERT INTO Stock.ProductList OUTPUT INSERTED.ProductID, suser_name() INTO @InsertDetails VALUES ('Racing Bike', 412.99) SELECT * FROM @InsertDetails DECLARE @PriceChangeDetails TABLE ( ProductID int, OldPrice money, NewPrice money, UpdatedBy sysname ) UPDATE Stock.ProductList SET Price = 3.99 OUTPUT INSERTED.ProductID, DELETED.Price, INSERTED.Price, suser_name() INTO @PriceChangeDetails WHERE ProductID = 1 SELECT * FROM @PriceChangeDetails DECLARE @DeleteDetails TABLE ( ProductID int, DeletedBy sysname ) DELETE Stock.ProductList OUTPUT DELETED.ProductID, suser_name() INTO @DeleteDetails WHERE ProductID = 2 SELECT * FROM @DeleteDetails

Las CTE’s permiten crear consultas que trabajan con datos recursivos Consultas más entendibles Implementación de algoritmos recursivos WITH TopSales (SalesPersonID, NumSales) AS ( SELECT SalesPersonID, Count(*) FROM Sales.SalesOrderHeader GROUP BY SalesPersonId ) --Select simple SELECT * FROM TopSales WHERE SalesPersonID IS NOT NULL ORDER BY NumSales DESC --Ejemplo de Join SELECT ts.SalesPersonID, sp.SalesYTD, ts.NumSales FROM Sales.SalesPerson sp INNER JOIN TopSales ts ON ts.SalesPersonID = sp.SalesPersonID ORDER BY NumSales DESC

Las CTE’s permiten crear consultas que trabajan con datos recursivos

Consultas más entendibles

Implementación de algoritmos recursivos

Las operaciones PIVOT y UNPIVOT están indicadas para la creación de consultas cuyo resultado debe ser una matriz Por cada línea de los resultados, tendremos un conjunto variable de columnas que nos mostrarán valores calculados con una función de agregado La operación PIVOT nos permite convertir los resultados de una consulta en columnas, mientras que UNPIVOT nos convierte las columnas en resultados

Las operaciones PIVOT y UNPIVOT están indicadas para la creación de consultas cuyo resultado debe ser una matriz

Por cada línea de los resultados, tendremos un conjunto variable de columnas que nos mostrarán valores calculados con una función de agregado

La operación PIVOT nos permite convertir los resultados de una consulta en columnas, mientras que UNPIVOT nos convierte las columnas en resultados

Ejemplo de PIVOT Creamos una tabla de Pedidos Añadimos los siguientes valores CREATE TABLE Sales.[Order] ( Customer varchar(8), Product varchar(5), Quantity int ) Customer Product Quantity Mike Bike 3 Mike Chain 2 Mike Bike 5 Lisa Bike 3 Lisa Chain 3 Lisa Chain 4

Ejemplo de PIVOT

Creamos una tabla de Pedidos

Añadimos los siguientes valores

Vamos a realizar una operación de PIVOT sobre la tabla El resultado sería SELECT * FROM Sales.[Order] PIVOT (SUM(Quantity) FOR Product IN ([Bike],[Chain])) AS PVT Customer Bike Chain Lisa 3 7 Mike 8 2 Lisa 3 7 Mike 8 2 Lisa 3 7 Mike 8 2

Vamos a realizar una operación de PIVOT sobre la tabla

El resultado sería

Si realizamos una operación UNPIVOT sobre la tabla Sales.PivotedOrder El resultado sería SELECT Customer, Product, Quantity FROM Sales.PivotedOrder UNPIVOT (Quantity FOR Product IN ([Bike],[Chain])) AS UnPVT Customer Product Quantity Mike Bike 8 Mike Chain 2 Lisa Bike 3 Lisa Chain 7

Si realizamos una operación UNPIVOT sobre la tabla Sales.PivotedOrder

El resultado sería

Este operador permite aplicar una función que devuelva una tabla por cada fila de una tabla obtenida por JOIN Tenemos 2 tipos de operadores APPLY CROSS APPLY Sólo se incluirán filas del JOIN que produzcan un resultado en la llamada a la función que devuelve una tabla OUTER APPLY Se incluirán todas las filas del JOIN Normalmente lo que haremos será aplicar una función que tome como parámetros valores de la fila y nos devuelva una nueva tabla

Este operador permite aplicar una función que devuelva una tabla por cada fila de una tabla obtenida por JOIN

Tenemos 2 tipos de operadores APPLY

CROSS APPLY

Sólo se incluirán filas del JOIN que produzcan un resultado en la llamada a la función que devuelve una tabla

OUTER APPLY

Se incluirán todas las filas del JOIN

Normalmente lo que haremos será aplicar una función que tome como parámetros valores de la fila y nos devuelva una nueva tabla

Veamos un ejemplo de uso Crearemos una función que nos devuelva los 3 últimos pedidos de un cliente Utilizando CROSS APPLY obtendremos el nombre del cliente (y los detalles de los pedidos) sólo de los clientes que hayan realizado algún pedido CREATE FUNCTION Sales.MostRecentOrders(@CustID int) RETURNS TABLE AS RETURN SELECT TOP (3) SalesOrderID, OrderDate FROM Sales.SalesOrderHeader WHERE CustomerID = @CustID ORDER BY OrderDate DESC SELECT Name Customer, MR.* FROM Sales.Store CROSS APPLY Sales.MostRecentOrders(CustomerID) AS MR

Veamos un ejemplo de uso

Crearemos una función que nos devuelva los 3 últimos pedidos de un cliente

Utilizando CROSS APPLY obtendremos el nombre del cliente (y los detalles de los pedidos) sólo de los clientes que hayan realizado algún pedido

Utilizando OUTER APPLY obtendremos el nombre del cliente (y los detalles de los pedidos) de todos los clientes SELECT Name AS Customer, MR.* FROM Sales.Store OUTER APPLY Sales.MostRecentOrders(CustomerID) AS MR

Utilizando OUTER APPLY obtendremos el nombre del cliente (y los detalles de los pedidos) de todos los clientes

SQL Server 2005 nos proporciona 4 nuevas funciones de ordenación/ranking: RANK, DENSE_RANK,NTILE y ROW_NUMBER Para todas ellas podremos aplicar la cláusula OVER para particionar y ordenar las filas de resultados La cláusula PARTITION BY determina el criterio de agrupación mientras que ORDER BY determina el criterio de ordenación OVER ( [ PARTITION BY < value_expression > , ... [ n ] ] ORDER BY <column> [ ASC | DESC ] [, ...[ n ] ] )

SQL Server 2005 nos proporciona 4 nuevas funciones de ordenación/ranking: RANK, DENSE_RANK,NTILE y ROW_NUMBER

Para todas ellas podremos aplicar la cláusula OVER para particionar y ordenar las filas de resultados

La cláusula PARTITION BY determina el criterio de agrupación mientras que ORDER BY determina el criterio de ordenación

La función RANK nos permite obtener el número de orden de cada fila, dentro de una determinada partición SELECT P.Name Product, P.ListPrice, PSC.Name Category, RANK() OVER(PARTITION BY PSC.Name ORDER BY P.ListPrice DESC) AS PriceRank FROM Production.Product P JOIN Production.ProductSubCategory PSC ON P.ProductSubCategoryID = PSC.ProductSubCategoryID

La función RANK nos permite obtener el número de orden de cada fila, dentro de una determinada partición

La función DENSE_RANK es similar a la de RANK, pero no deja “huecos” a la hora de elaborar el ranking SELECT P.Name Product, P.ListPrice, PSC.Name Category, DENSE_RANK() OVER(PARTITION BY PSC.Name ORDER BY P.ListPrice DESC) AS PriceRank FROM Production.Product P JOIN Production.ProductSubCategory PSC ON P.ProductSubCategoryID = PSC.ProductSubCategoryID

La función DENSE_RANK es similar a la de RANK, pero no deja “huecos” a la hora de elaborar el ranking

Esta función permite obtener el número de cada fila dentro de un conjunto de resultados SELECT ROW_NUMBER() OVER(PARTITION BY PC.Name ORDER BY ListPrice) AS Row, PC.Name Category, P.Name Product, P.ListPrice FROM Production.Product P JOIN Production.ProductSubCategory PSC ON P.ProductSubCategoryID = PSC.ProductSubCategoryID JOIN Production.ProductCategory PC ON PSC.ProductCategoryID = PC.ProductCategoryID

Esta función permite obtener el número de cada fila dentro de un conjunto de resultados

Esta función permite crear grupos de resultados numerados, a partir de las filas del conjunto de resultados SELECT NTILE(3) OVER(PARTITION BY PC.Name ORDER BY ListPrice) AS PriceBand, PC.Name Category, P.Name Product, P.ListPrice FROM Production.Product P JOIN Production.ProductSubCategory PSC ON P.ProductSubCategoryID = PSC.ProductSubCategoryID JOIN Production.ProductCategory PC ON PSC.ProductCategoryID = PC.ProductCategoryID

Esta función permite crear grupos de resultados numerados, a partir de las filas del conjunto de resultados

SQL Server 2005 incluye la posibilidad de realizar una gestión de excepciones de forma estructurada Esto simplifica muchísimo el desarrollo del código La gestión de las excepciones se realizará en bloques TRY-CATCH Dentro del bloque TRY incluiremos el código que potencialmente puede generar errores Dentro del bloque CATCH realizaremos la captura de los posibles errores y su tratamiento adecuado

SQL Server 2005 incluye la posibilidad de realizar una gestión de excepciones de forma estructurada

Esto simplifica muchísimo el desarrollo del código

La gestión de las excepciones se realizará en bloques TRY-CATCH

Dentro del bloque TRY incluiremos el código que potencialmente puede generar errores

Dentro del bloque CATCH realizaremos la captura de los posibles errores y su tratamiento adecuado

Sintaxis: Elimina la necesidad de utilizar la variable global @@error Si vamos a utilizar esta gestión de excepciones, será necesario activar una opción que indica que los errores producidos en el TRY, automáticamente aborten la transacción actual: SET XACT_ABORT ON BEGIN TRY { sql_statement | statement_block } END TRY BEGIN CATCH TRAN_ABORT { sql_statement | statement_block } END CATCH

Sintaxis:

Elimina la necesidad de utilizar la variable global @@error

Si vamos a utilizar esta gestión de excepciones, será necesario activar una opción que indica que los errores producidos en el TRY, automáticamente aborten la transacción actual: SET XACT_ABORT ON

Para asegurarnos de que transacciones que hayan podido quedar en estado “fantasma” se cierren adecuadamente, debemos incluir en el bloque CATCH, una sentencia ROLLBACK TRANSACTION Si queremos consultar la variable @@error, debemos hacerlo en la primera línea del CATCH Si necesitamos levantar una excepción “de aplicación” lo haremos usando RAISERROR:WITH TRAN_ABORT

Para asegurarnos de que transacciones que hayan podido quedar en estado “fantasma” se cierren adecuadamente, debemos incluir en el bloque CATCH, una sentencia ROLLBACK TRANSACTION

Si queremos consultar la variable @@error, debemos hacerlo en la primera línea del CATCH

Si necesitamos levantar una excepción “de aplicación” lo haremos usando RAISERROR:WITH TRAN_ABORT

CREATE TABLE dbo.DataTable (ColA int PRIMARY KEY, ColB int) CREATE TABLE dbo.ErrorLog (ColA int, ColB int, error int, date datetime) GO CREATE PROCEDURE dbo.AddData @a int, @b int AS SET XACT_ABORT ON BEGIN TRY BEGIN TRAN INSERT INTO dbo.DataTable VALUES (@a, @b) COMMIT TRAN END TRY BEGIN CATCH TRAN_ABORT DECLARE @err int SET @err = @@error --trap the error number ROLLBACK TRAN INSERT INTO dbo.ErrorLog VALUES (@a, @b, @err, GETDATE()) END CATCH GO EXEC dbo.AddData 1, 1 EXEC dbo.AddData 2, 2 EXEC dbo.AddData 1, 3 --violates the primary key

Add a comment

Related presentations

Related pages

Mejoras en T-SQL para SQL Server 2005 - HubSlide

Esta presentación nos muestra las características incluidas en el lenguaje T-SQL en SQL Server 2005 y que no estaban en versiones anteriores
Read more

Novedades y mejoras en Transact-SQL (Transact-SQL)

SQL Server 2005 extiende y mejora la sintaxis de Transact-SQL para que ofrezca ... Las mejoras de Transact-SQL disponibles en esta versión de SQL ...
Read more

Microsoft SQL Server 2005

SQL Server 2005 ha sido diseñado para ayudar a las empresas a enfrentarse a estos retos. ... SQL Server 2005, basado en el mismo enfoque ... Mejoras en la ...
Read more

Seguridad en SQL Server 2005 - microsoft.com

... de SQL Server. Para cada amenaza ... SQL Server 2005 incorporará mejoras ... recursos de SQL Server en función ...
Read more

Microsoft SQL Server - Wikipedia, la enciclopedia libre

Microsoft SQL Server; Desarrollador(es) Microsoft www.microsoft.com/sql/ Información general; Última versión estable: SQL Server 2014 (12.0) [1] Abril ...
Read more

PPT – SQL Server 2005 PowerPoint presentation | free to ...

SQL Server 2005 - PowerPoint PPT Presentation. The presentation will start after a short (15 second) video ad from one of our sponsors. Hot tip: Video ads ...
Read more

Mejoras de los sinónimos de Transact-SQL

Mejoras para las bases de datos en Transact-SQL. ... SQL Server 2005 Un sinónimo es un nombre alternativo para un objeto de ámbito de esquema. Los ...
Read more

Mejoras en el "scriptado" de bases de datos | Blog de SolidQ

Mejoras en el “scriptado” de ... SQL Server (Administración & T-SQL) ... Con SQL Server 2008 tan solo tenemos que marcar la opción “Script Data ...
Read more

Mejoras de Integration Services en SQL 2012 | Microsoft ...

A partir de SQL Server 2005, ... SQL Server Integration Services (SSIS) Mejoras en la ... los valores en tiempo de ejecución para el ...
Read more