manual administracion de bases de datos i - v0810

122

Upload: daniella-kyj

Post on 11-Aug-2015

156 views

Category:

Documents


13 download

TRANSCRIPT

Page 1: Manual Administracion de Bases de Datos I - V0810
Page 2: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 2

Presentación…………………………………………………………………………………………..3

Modulo A

Semana 1: Creación de Base de Datos y Archivos de datos……………….……...4

Semana 2: Creación de Tipos de Datos y Tablas .........……...………….…….28

Semana 3: Creación de Índices e Implementación de consultas.....…..………38

Semana 4: Consultas Multitablas – Subconsultas......……………........….………65

Semana 5: Consultas Agrupadas – Funciones de Grupo - Vistas…….…….....74

Semana 6: Revisión de conocimientos……………………………………..…...……….92

Semana 7: Procedimientos Almacenados I ……………………………………………109

Semana 8: Procedimientos Almacenados II .…………………………………………115

Semana 9: Funciones definidas por el usuario – Trigger…………………121

Bibliografía: ……………………………………………………………………………………………

Page 3: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 3

PRESENTACIÓN

Esta guía didáctica es un material de ayuda institucional, perteneciente a las

especialidades de computación, Ingeniería de Software e Ingeniería de Redes y

Comunicaciones tiene por finalidad proporcionar los conocimientos de la

implementación y administración de Base de Datos en su primera parte.

La Organización SISE, líder en la enseñanza tecnológica a nivel superior, promueve

la elaboración de materiales educativos, en concordancia a las exigencias de las

tecnologías de estos tiempos, que permiten la creación de nuevas herramientas de

aprendizaje con el objetivo de facilitar el acceso de los estudiantes a la educación en

el marco del desarrollo tecnológico de la informática de las telecomunicaciones.

Esta guía contiene conceptos relacionados con la planificación en la creación de una

base de datos, así como los objetos contenidos en él, como tablas de datos, índices,

tipos de datos, funciones, procedimientos almacenados y disparadores. También

contiene información sobre las sentencias para el manejo de datos.

En este proceso el alumno aprenderá sentencias SQL (DDL – DML - DCL), que le

permitirá definir, manipular y controlar datos, utilizando el sistemas administrador de

base de datos Microsoft SQL Server.

La implementación de una Base de datos, permitirán que el alumno aplique todos los

conceptos.

Este material en su primera edición, servirá para ayudar a nuestros estudiantes

SISESINOS.

Page 4: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 4

Arreglos

Contenidos

- Lección 1: Crear Databases - Lección 2: Crear Filegroups - Lección 3: Crear Schemas

____________________________________________________________________________

Después de completar esta semana, los alumnos serán capaces de:

■ Crear bases de datos.

■ Crear grupos de archivos.

■ Crear esquemas.

Introducción Una de las tareas más fundamentales que un desarrollador de bases de datos

debe realizar es la creación de una base de datos y sus componentes principales, tales como

grupos de archivos y esquemas.

En esta semana, usted aprenderá cómo crear bases de datos, grupos de archivos, esquemas.

Page 5: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 5

BASE DE DATOS

Una Base de Datos es un contenedor de Objetos, estos objetos puede ser:

Orígenes de Datos Dimensiones Procedimientos Funciones

Desde el concepto mas simple una base de datos, es un conjunto de datos relevantes, trascendentes para el negocio, que se encuentran ordenados, organizados en estructuras llamadas tablas, estas, a su vez estarán interrelacionadas, todo ello almacenado en un sistema computacional (Server, Storage, Software DBMS).

Para Administrar y gestionar esta estructura a nivel corporativo (transacciones de millones de registros) que se encuentran en un servidor, se necesita un DBMS (Data Base Manager System). Un DBMS, es un programa que permite crear, administrar y gestionar, sistemas de base de datos. Entre los DBMS mas importantes vigentes en el mercado, tenemos:

ORACLE Database 11g Microsoft SQL Server 2008 IBM DB2 SyBase Postgre SQL.

Page 6: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 6

Un DBMS, junto al Servidor y Storage (Almacenamiento), conforman el sistema de Base de Datos, que en todo momento debe ofrecer:

Accesibilidad Alta Disponibilidad Seguridad Alto Performance

Todos estos DBMS, utilizan un lenguaje standard, este lenguaje es el SQL. SQL es un acrónimo (Structured Query Language), adoptado como lenguaje de base de datos relacional por ISO (International Standard Organization), desde 1987. El Lenguaje SQL, presenta una serie de comandos, y estos se clasifican en:

DDL (Data Definition Language – Lenguaje de definición de datos) DML (Data Manipulation Language – Lenguaje de manipulación de datos) DCL (Data Control Language – Lenguaje de control de Datos)

DDL DML DCLPara crear Base de datos y

sus objetos

Para manipulación de datos,

transacciones

Para controlar, gestionar,

asegurar informaciónCREATE INSERT GRANT

ALTER DELETE REVOKE

DROP UPDATE BACKUP

SELECT RESTORE Todos estos DBMS, utilizan un lenguaje standard, este lenguaje es el SQL. SQL es un acrónimo (Structured Query Language), adoptado como lenguaje de base de datos relacional por ISO (International Standard Organization), desde 1987.

Page 7: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 7

Creación de una Base de Datos:

Es importante saber, que en Microsoft SQL Server 2008, existen las bases de datos del sistema. SQL Server incluye las siguientes bases de datos del sistema.

Base de datos del sistema Descripción

masterRegistra toda la información del sistema para una instancia de SQL

Server.

msdbLa utiliza el Agente SQL Server para programar alertas y trabajos.

model

Se utiliza como plantilla para todas las bases de datos creadas en

la instancia de SQL Server. Las modificaciones hechas a la base de

datos model, como el tamaño de la base de datos, la

intercalación, el modelo de recuperación y otras opciones de base

de datos, se aplicarán a las bases de datos que se creen con

posterioridad.

tempdbÁrea de trabajo que contiene objetos temporales o conjuntos de

resultados intermedios.

. Antes de crear una base de datos considere lo siguiente:

Puede utilizar SQL Server para realizar el procesamiento de transacciones, almacenar y analizar datos y construir nuevas aplicaciones de bases de datos. SQL Server es una familia de productos y tecnologías que se reúne el almacenamiento de datos requisitos de procesamiento de transacciones online (OLTP) y el procesamiento analítico en línea (OLAP) entornos.

Page 8: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 8

SQL Server es un sistema de base de datos relacional de gestión de (RDBMS) que: ■ Administra el almacenamiento de datos para las transacciones y el análisis. ■ Almacena los datos en una amplia gama de tipos de datos, incluyendo texto, numérico, extensible Markup Language (XML), y objetos de gran tamaño. ■ Responde a las peticiones de aplicaciones cliente. ■ Utilización de Transact-SQL, XML, SQL Server u otros comandos para enviar solicitudes entre una aplicación cliente y SQL Server. El componente de RDBMS de SQL Server es responsable de: ■ El mantenimiento de las relaciones entre los datos de una base de datos. ■ Asegurar que los datos se almacenan correctamente y que las normas que definen las relaciones entre los datos no sean violados. ■ La recuperación de todos los datos a un punto de coherencia conocido, en el caso de un sistema fallo. Bases de datos OLTP Su función es organizar los datos en tablas relacionales de una base de datos OLTP, reducir la información redundante y aumentar la velocidad de las actualizaciones. SQL Server permite a un gran número de usuarios realizar transacciones y al mismo tiempo cambiar los datos en tiempo real en bases de datos OLTP. Bases de datos OLAP Tecnología OLAP se utiliza para organizar y resumir grandes cantidades de datos para que un analista pueda evaluar los datos de forma rápida y en tiempo real. Microsoft Analysis Server SQL Services organiza estos datos para apoyar una amplia gama de soluciones empresariales, desde presentación de informes empresariales y análisis para el modelado de datos y soporte de decisiones. El usuario que crea la base de datos, se convierte en su propietario En un servidor se puede crear hasta 32,767 bases de datos Las funciones fijas del servidor que tienen permiso para crear base de datos son:

sysadmin (sa) y dbcreator, aunque se puede otorgar permiso a otros usuarios.

Una base de datos tiene una estructura física conformada por archivos, estos pueden ser de 02 tipos: DataFile (Archivo de datos).- Que son de 02 subtipos:

o Primary DataFile.- Archivos de datos primarios, es el principal archivo de datos, es el punto de partida de la base de datos y puntos a los otros archivos de la base de datos. Cada base de datos tiene un archivo de datos principal. La extensión de nombre de archivo recomendado para los archivos de datos primarios es .mdf.

o Secondary DataFile.- Archivos de datos secundarios se componen de todos los

archivos de datos, distinto del archivo de datos principal. Algunas bases de datos pueden no tener los archivos de datos secundarios, mientras que otros tienen varios archivos de datos secundarios. La extensión de nombre de archivo recomendado para archivos de datos secundarios es .ndf.

LogFile (Archivo de registro de transacciones).- Archivos de registro mantienen toda la

información de registro que se utiliza para recuperar la base de datos. Debe haber al menos un archivo de registro para cada base de datos, aunque puede haber más de uno. La extensión de nombre de archivo recomendado para archivos de registro es .ldf.

Page 9: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 9

PRIMARY SECONDARY

DATAFILE DATAFILE

(.mdf) (.ndf)

LOGFILE

(.ldf)

BASE DE DATOS

DATAFILE LOGFILE

Cada archivo tiene sus propiedades que son: Name FileName Size MaxSize FileGrowth Al planear una nueva base de datos, usted debe tomar en cuenta varios aspectos. Estos incluyen, pero no se limitan a, lo siguiente: ■ EL propósito de almacenamiento de datos OLTP y bases de datos OLAP son diferentes y, por lo tanto, los requisitos de diseño diferentes. ■ Rendimiento de transacciones. Las Bases de datos OLTP a menudo tienen un alto requerimiento para el número de transacciones que pueden ser procesados por minuto, hora o día. Un diseño eficiente con un nivel apropiado de normalización, índices y datos particiones pueden lograr un nivel muy alto de rendimiento de transacciones. ■ El potencial de crecimiento de almacenamiento de datos física. Grandes cantidades de datos requieren hardware adecuado para la memoria, espacio en disco duro y unidad central de procesamiento (CPU) de potencia. Estimación de la cantidad de datos que almacenará la base de datos sobre meses y años posteriores ayudará a asegurarse de que su base de datos trabaje de manera eficiente. Puede configurar las bases de datos para que los archivos puedan crecer automáticamente hasta un tamaño máximo especificado. Sin embargo, el crecimiento automático de archivos puede afectar al rendimiento.

Page 10: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 10

En la mayoría de soluciones de bases de datos basadas en servidor, debe crear la base de datos con archivos de tamaño adecuado, vigilar el uso del espacio, y reasignar más espacio sólo cuando sea necesario. ■ Ubicación del archivo. ¿Dónde colocar los archivos de base de datos puede tener un impacto en rendimiento. Si usted es capaz de utilizar varias unidades de disco, puede extender sus archivos de base de datos a través de más de un disco. Esto permite a SQL Server tener ventaja de las conexiones múltiples y múltiples discos cabezas de lectura y escritura de datos eficaz. Ejemplo de la creación de una base de datos. Puede crear una base de datos utilizando las herramientas visuales en SQL Server Management Studio o el comando DDL Transact-SQL CREATE DATABASE. El siguiente ejemplo muestra cómo crear una base de datos mediante Transact-SQL.

CREATE DATABASE TestDB ON (NAME = 'TestDB_Data', FILENAME = 'D:\DATA\TransactTestDB.mdf', SIZE = 20 MB, FILEGROWTH = 0) LOG ON (NAME = 'TestDB_Log', FILENAME = 'D:\DATA\TestDB_Log.ldf', SIZE = 5 MB, FILEGROWTH = 0)

Transaction Logging

Page 11: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 11

Transaction Una transacción es una sola unidad de trabajo en una base de datos. El acrónimo ACID es de uso frecuente para describir las características de una transacción. ACID significa: ■ Atomicidad. Una transacción es una unidad atómica, bien de todas las operaciones definidas en las transacciones se han completado, o ninguno de ellos se completan. ■ Coherencia. Una transacción siempre deja los datos en un estado coherente. ■ Aislamiento (Isolation). Una transacción opera al margen de la actividad de otra base de datos; otra actividad de base de datos concurrentes no tiene ningún efecto sobre la transacción. ■ Durabilidad. Cuando una transacción se confirma, los resultados se almacenan en dispositivos de almacenamiento persistentes y sobrevivirá al fallo del sistema. SQL Server es compatible con transacciones implícitas para las intervenciones individuales que modifican datos y las transacciones explícitas para múltiples sentencias que deben ejecutarse como una unidad. Transaction log SQL Server, registra todas las transacciones en un fichero de transacción de registro para mantener base de datos coherente y para ayudar en la recuperación de un fallo de base de datos. El registro (LOG) es un área de almacenamiento que automáticamente rastrea los cambios en una base de datos. SQL Server graba en el disco las modificaciones, en el LOG están las modificaciones que se realizan antes de escribirlos en la base de datos. Logging process El proceso de registro es el siguiente: 1. La aplicación envía una modificación de datos. 2. Cuando una modificación es ejecutada, las páginas de datos afectados se cargan desde el disco en la caché del búfer, a condición de que las páginas no se encuentran ya en la caché del búfer de una consulta anterior. 3. El LOG registra cada instrucción de modificación de datos como la modificación que se haga. El cambio se registra siempre en el LOG y se escribe en disco antes de que se haga en la base de datos. Este tipo de registro se denomina registro de escritura anticipada. 4. En forma recurrente, el proceso escribe todas las transacciones terminadas a la base de datos en el disco. Si el sistema falla, el proceso de recuperación automático utiliza el registro de transacciones (LOG) a ejecutar todas las transacciones confirmadas y hacer retroceder (RollBack) cualquier transacción incompleta. El registro utiliza marcadores de transacción durante la recuperación automática para determinar el inicio y los puntos de finalización de una transacción. Una transacción se considera completa cuando el marcador BEGIN TRANSACTION tiene un marcador asociado COMMIT TRANSACTION, las páginas de datos se escriben en el disco cuando se produce un CheckPoint.

Page 12: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 12

Práctica: Creación de bases de datos Objetivos El objetivo de esta práctica es para que usted pueda crear una base de datos con SQL Server Management Studio y mediante el uso de Transact-SQL. En esta práctica, se utiliza tanto técnicas para crear una nueva base de datos. Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual. Para crear una base de datos utilizando SQL Server Management Studio En el explorador de objetos de Microsoft SQL 2008, señalar el contenedor BASE DE

DATOS, hacer click en el botón secundario, luego elegir la opción NUEVA BASE DE

DATOS, aparecerá la ventana para definir el nombre y propiedades de la Base de Datos a

crear.

Page 13: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 13

En el cuadro de diálogo Nueva base de datos, introducir los datos en la tabla siguiente.

Propiedad Valor Nombre de Base de datos testdb Tamaño inicial de testdb 20

1. En la columna de Crecimiento automático de la entrada testdb, haga clic en el botón de puntos suspensivos (...). 2. En el cuadro de Crecimiento automático, en el cuadro de diálogo para testdb, desactive la opción Habilitar Crecimiento automático en la casilla de verificación y, a continuación, haga clic en Aceptar. 3. Cambiar el tamaño inicial de configuración de la entrada TestDB_log a 5 MB. 4. En la columna de Crecimiento automático de la entrada TestDB_log, haga clic en el botón de puntos suspensivos (...). 5. En el Crecimiento automático en el cuadro de diálogo para TestDB_log, desactive la opción Habilitar Crecimiento automático en el cuadro de verificación y haga clic en Aceptar. 6. En el cuadro de diálogo Nueva base de datos, haga clic en Aceptar para crear la base de datos. 7. En Explorador de objetos, expanda la carpeta Bases de datos para verificar que se ha creado la base de datos testdb, y si testdb no aparece, haga clic en la carpeta Bases de datos y haga clic en Actualizar. 8. Mantenga SQL Server Management Studio abierto. Lo utilizará en el siguiente procedimiento.

Page 14: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 14

Para crear una base de datos utilizando Transact-SQL Realice los pasos siguientes para crear una base de datos mediante Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL (el parámetro filename debe ser escrita en una sola línea).

CREATE DATABASE TransactTestDB ON (NAME = 'TransactTestDB', FILENAME = 'C:\Program Files\Microsoft SQL

Server\MSSQL.1\MSSQL\DATA\TransactTestDB.mdf', SIZE = 20 MB, FILEGROWTH = 0)

LOG ON (NAME = 'TransactTestDB_Log', FILENAME = 'C:\Program Files\Microsoft SQL

Server\MSSQL.1\MSSQL\DATA\TransactTestDB_Log.ldf', SIZE = 5 MB, FILEGROWTH = 0)

3. Haga clic en el botón Ejecutar en la barra de herramientas. 4. Cuando el comando se ha completado correctamente, haga clic en la carpeta Bases de datos en el Explorador de objetos, y luego haga clic en Actualizar para comprobar que la base de datos TransactTestDB ha sido creada. Ejemplos A. Crear una base de datos sin especificar archivos En el ejemplo siguiente se crea la base de datos myTest, crea un archivo primario correspondiente y archivo de registro de transacciones.

USE master; GO CREATE DATABASE mytest; GO -- Verify the database files and sizes SELECT name, size, size*1.0/128 AS [Size in MBs] FROM sys.master_files WHERE name = N'mytest'; GO

B. Creación de una base de datos que especifica los datos y archivos de registro de transacciones. En el ejemplo siguiente se crea la base de datos de ventas (SALES). El primer archivo (Sales_dat) se convierte en el archivo principal. El archivo Sales_log se asigna en megabytes, porque el sufijo MB se recoja explícitamente en el parámetro de tamaño.

Page 15: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 15

USE master; GO CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME='C:\saledat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Sales_log, FILENAME = 'C:\salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) GO

C. Crear una base de datos mediante la especificación de archivos de datos múltiples y archivos de registro de transacciones

USE master; GO CREATE DATABASE Archive ON PRIMARY (NAME = Arch1, FILENAME = 'D:\SalesData\archdat1.mdf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = Arch2, FILENAME = 'D:\SalesData\archdat2.ndf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), ( NAME = Arch3, FILENAME = 'D:\SalesData\archdat3.ndf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20) LOG ON (NAME = Archlog1, FILENAME = 'D:\SalesData\archlog1.ldf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20), (NAME = Archlog2, FILENAME = 'D:\SalesData\archlog2.ldf', SIZE = 100MB, MAXSIZE = 200, FILEGROWTH = 20) ; GO

Page 16: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 16

Creando FILEGROUPS

SQL Server 2008 almacena los datos en archivos de datos que luego pueden ser agrupados en uno o más grupos de archivos. A pesar de una base de datos se puede ejecutar con éxito con un solo grupo de archivos, hay veces en que podría ser ventajoso crear grupos de archivos múltiples. En esta parte, usted aprenderá acerca de grupos de archivos y cómo se puede mejorar el funcionamiento de una base de datos. También aprenderás cómo crear grupos de archivos.

¿Qué es un FILEGROUP?

Un grupo de archivos es una colección lógica de archivos de datos que permite a los administradores administrar todos los archivos dentro del grupo de archivos como un solo tema. La capacidad de controlar la ubicación física de objetos individuales en la base de datos puede proporcionar un número de gestión y ventajas de rendimiento. Por ejemplo, puede utilizar grupos de archivos múltiples para controlar la forma en que el datos en una base de datos se almacena físicamente en dispositivos de almacenamiento y de separar de lectura / escritura de datos a partir de datos de sólo lectura. Tipos de FileGroups SQL Server 2005 tiene un grupo de archivos principal y también puede tener grupos de archivos definidos por el usuario. ■ El grupo de archivos principal contiene el archivo de datos principal con las tablas del sistema. El archivo de datos principal normalmente utiliza la extensión mdf. ■ Un grupo de archivos definido por el usuario se compone de archivos de datos que se agrupan para asignación y fines administrativos. Estos archivos de datos se conocen como archivos de datos secundarios y por lo general utilizan la extensión de la NDF.

Page 17: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 17

Ejemplo de escenarios para múltiples grupos de archivos

La ilustración es un ejemplo de cómo puede colocar los archivos de base de datos por separado sobre los discos, como se describe en la siguiente lista: ■ Puede crear grupos de archivos definidos por el usuario en archivos separados que son muy consultados de los que son muy modificadas. En la ilustración, los archivos OrdHist1.ndf y OrdHist2.ndf se colocan en un disco independiente de las tablas Producto, Cliente, y SalesOrderHeader, ya que se consultan para el apoyo a las decisiones con información actualizada de la orden actual. ■ También puede colocar el archivo OrdHist1.ndf y OrdHist2.ndf en discos diferentes si ambos son muy consultado. ■ No se puede colocar los archivos de registro de transacciones en grupos de archivos. No es aplicable. En el ejemplo siguiente de código Transact-SQL, se utiliza la instrucción CREATE DATABASE para aplicar este escenario.

CREATE DATABASE [AdventureWorks] ON PRIMARY ( NAME = N'AdventureWorks_Data', FILENAME = N'C:\AdventureWorks_Data.mdf' ), FILEGROUP [OrderHistoryGroup] ( NAME = N'OrdHist1',

FILENAME = N'D:\OrdHist1.ndf' ), ( NAME = N'OrdHist2',

FILENAME = N'D:\OrdHist2.ndf' ) LOG ON ( NAME = N'AdventureWorks_log',

FILENAME = N'E:\AdventureWorks_log.ldf')

También puede utilizar la instrucción ALTER DATABASE para añadir o eliminar archivos y grupos de archivos en bases de datos existentes. Cuándo crear grupos de archivos Puede crear varios archivos de datos en discos diferentes y crear un grupo de archivos definido por el usuario para contener dichos archivos. Las dos razones principales para el uso de grupos de archivos son para mejorar rendimiento y para controlar la ubicación física de los datos.

Page 18: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 18

Uso de archivos múltiples en un grupo de archivos único para el rendimiento

A pesar de que un arreglo de discos independientes (RAID) es una forma que prefiera para mejorar la el rendimiento de una base de datos, puede asignar varios archivos en discos diferentes a un único grupo de archivos para mejorar el rendimiento mediante la aplicación de una forma de creación de bandas de datos en SQL Server. Dado que SQL Server utiliza una estrategia de relleno proporcional al escribir datos en un grupo de archivos, los datos son esencialmente repartidos entre los archivos y, por tanto, a través de la particiones de disco físico. Este enfoque permite un control más preciso a los datos de creación de bandas que se puede lograr cuando se crea un volumen conjunto de bandas en el sistema operativo de Windows o mediante el uso de un controlador de matriz RAID.

Uso de grupos de archivos múltiples para controlar la ubicación de los datos físicos

Para utilizar grupos de archivos para facilitar el mantenimiento o alcanzar objetivos de diseño, usted puede: ■ Almacenar datos de lectura / escritura por separado, para mantener diferentes tipos de disco De E / S por separado. ■ Guarde los índices en discos diferentes de las tablas, que pueden conducir a una mejora rendimiento. ■ Haga copias de seguridad o restaurar archivos individuales o grupos de archivos en lugar de copias de seguridad o restauración una base de datos. La copia de seguridad de archivos o grupos de archivos puede ser necesario para los grandes bases de datos, como estrategia para tener una copia de seguridad y restauración efectiva.

Page 19: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 19

Práctica: Creación de grupos de archivos Objetivo

El objetivo de esta práctica es que le permiten crear grupos de archivos el uso de Transact-SQL.

Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual.

Para crear un grupo de archivos mediante el uso de Transact-SQL

Realice los pasos siguientes para crear un grupo de archivos mediante el uso de Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra

de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. ALTER DATABASE [TransactTestDB] ADD FILEGROUP [SECONDARY] GO

ALTER DATABASE [TransactTestDB] ADD FILE ( NAME = N'Test2', FILENAME =N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Test2.ndf' ) TO FILEGROUP [SECONDARY] GO

ALTER DATABASE [TransactTestDB] MODIFY FILEGROUP [SECONDARY] DEFAULT GO

3. Haga clic en el botón Ejecutar en la barra de herramientas. 4. Compruebe seleccionando la Base de Datos TransactTestDB, click en botón

secundario (botón derecho) y propiedades. Aquí podrá visualizar los grupos de archivos y cual es el que se encuentra activo o por default.

Page 20: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 20

Creando SCHEMA Los desarrolladores que han trabajado con Microsoft .NET Framework o XML se familiarizado con el concepto de espacios de nombres (NameSpace). Un espacio de nombres ayuda a agrupar objetos relacionados, lo que hace que los objetos de la lista sean manejables. SQL Server 2008 utiliza esquemas para aplicar un concepto similar para los objetos de base de datos. En esta lección, obtendrá información acerca de los esquemas de trabajo y cómo ayudan a desarrollar estructuras de base de datos que son fáciles de manejar. También aprenderá a crear sus esquemas de base de datos. ¿Qué es un SCHEMA?

Los objetos en una base de datos (como tablas, vistas y procedimientos almacenados) se crean dentro de un esquema. Es esencial que usted entienda que antes de un esquema, está la planificación y la aplicación en una base de datos de SQL Server 2008.

Un esquema es un espacio de nombres para los objetos de base de datos. En otras palabras, un esquema define un límite en el que todos los nombres son únicos. Dado que los nombres de esquema deben ser único en la base de datos, cada objeto en una base de datos tiene un único nombre en el server.database.schema.object. Dentro de una base de datos, puede acortar a schema.object. La ilustración anterior muestra tres esquemas en la base de datos AdventureWorks en una Instancia de SQL Server denominada Server1. Los esquemas se nombran Person, Sales y dbo. Cada uno de estos esquemas contiene una tabla, y el nombre completo de la tabla incluye el servidor, base de datos, y el nombre de esquema. Por ejemplo, el nombre completo de la tabla ErrorLog en el esquema dbo es: Server1.AdventureWorks.dbo.ErrorLog.

Page 21: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 21

En SQL Server 2008, los esquemas proporciona los siguientes beneficios: ■ Una mayor flexibilidad en la organización de los objetos de base de datos en espacios de nombres, ya que el agrupación de objetos en los esquemas no depende de la propiedad de objeto. ■ Simplificación de la gestión de permisos, porque el permiso se puede conceder en el esquema de alcance, así como en los objetos individuales. ■ Mejor capacidad de administración, porque dejar caer un usuario que no requiera el cambiar el nombre de todos los objetos que el usuario posee.

Ejemplo: La base de datos AdventureWorks utiliza los esquemas siguientes para organizar sus objetos de base de datos en espacios de nombres: ■ RecursosHumanos (HumanResources) ■ Persona (Person) ■ Producción (Production) ■ Compra (Purchasing) ■ Ventas (Sales) Por ejemplo, consulte la tabla Employee en el esquema HumanResources como: HumanResources.Employee. El SCHEMA dbo.-

Cada base de datos contiene un esquema llamado dbo. El esquema dbo es el esquema predeterminado para todos los usuarios que no tienen ninguna otra forma explícita de esquema predeterminado. Creando un SCHEMA. Para crear un esquema, utilice Explorador de objetos en SQL Server Management Studio o utilice la sentencia CREATE SCHEMA, como se muestra en el ejemplo siguiente: Use AdventureWorks GO CREATE SCHEMA Sales GO

Page 22: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 22

¿Cómo funciona la Resolución Nombre del Objeto?

Cuando una base de datos contiene varios esquemas, el objeto puede convertirse en la resolución de nombres confuso. Por ejemplo, una base de datos puede contener dos tablas llamado orden en dos esquemas diferentes, Sales y dbo. Los nombres de los objetos calificados dentro de la base de datos son inequívocos: Sales.Order y dbo.Order, respectivamente. Sin embargo, el uso de la Orden nombre no cualificado puede producir resultados inesperados. Puede asignar a los usuarios un esquema

SQL Server 2008 utiliza el siguiente proceso para resolver un nombre de objeto no calificado: 1. Si el usuario tiene un esquema predeterminado, SQL Server intenta encontrar el objeto en el predeterminado esquema. 2. Si el objeto no se encuentra en el esquema predeterminado del usuario, o si el usuario no tiene por defecto un esquema, SQL Server intenta encontrar el objeto en el esquema dbo. Por ejemplo, un usuario con el esquema predeterminado persona ejecuta la siguiente instrucción Transact-SQL: SELECT * FROM Contact SQL Server 2008 en primer lugar tratar de resolver el nombre de objeto a Person.Contact. Si el Persona de esquema no contiene un objeto denominado de contacto, SQL Server intentará resolver el nombre de objeto a dbo.Contact. Si un usuario con ningún esquema predeterminado definido ejecuta la misma instrucción, SQL Server inmediatamente resolver el nombre de objeto a dbo.Contact. Se puede asignar un esquema predeterminado a un usuario mediante el uso de la cláusula de la DEFAULT_SCHEMA o CREATE USER o ALTER USER.

Page 23: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 23

Por ejemplo, la siguiente instrucción Transact-SQL asigna Sale como el esquema predeterminado del usuario Anders. ALTER USER Anders WITH DEFAULT_SCHEMA = Sales

Práctica: Creación de SCHEMA Objetivo

El objetivo de esta práctica es crear esquemas mediante el uso de Transact-SQL. En esta práctica, se utiliza técnicas para crear un nuevo esquema.

Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual.

Para crear un SCHEMA mediante el uso de Transact-SQL

Realice los pasos siguientes para crear un esquema mediante el comando CREATE de Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra de herramientas. 2. En la nueva ventana, escriba el siguiente código de Transact-SQL. Use TransactTestDB GO CREATE SCHEMA [Marketing] GO 3. Haga clic en el botón Ejecutar en la barra de herramientas. 4. En Explorador de objetos, expanda Bases de datos, TransactTestDB, Seguridad, y esquemas, y confirmar que el esquema Marketing existe.

Page 24: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 24

Arreglos

Contenidos

- Lección 1: Crear Tipo de Dato - Lección 2: Crear Tablas

____________________________________________________________________________

Creando Tipo de dato Antes de poder crear una tabla, debe definir los tipos de datos para la tabla. Los tipos de datos especifican el tipo de información (caracteres, números o fechas) que una columna o campo puede contener, y la forma de cómo se almacenan los datos. SQL Server 2005 provee más de 30 tipos de datos del sistema específicos. SQL Server 2005 también es compatible con tipos de datos de alias, que son definidos por el usuario y que están basados en los tipos de datos del sistema.

Page 25: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 25

¿Cuáles son los tipos de datos suministrados por el sistema?

Los tipos de datos definen los valores permitidos para cada columna en una tabla de base de datos. SQL Server proporciona un número de tipos de datos. Algunas categorías de tipos de datos que son de uso común en varios lenguajes de programación y tienen asociados los tipos de datos de SQL Server. Usted debe utilizar el tipo de datos más pequeño que satisfaga sus necesidades. Así ahorrará de espacio en disco y proporcionará un mejor rendimiento.

En la tabla siguiente se describe los tipo de datos suministrado por el sistema de SQL Server 2005 e indica los sinónimos de datos estándar tipos usados el American National Standards Institute (ANSI) en sistemas de bases de datos ANSI.

Page 26: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 26

Tipos de Tipos de datos del Sinómino ANSI Número de

datos sistema de SQL Bytes

comunes Server

Entero Int Integer Integer

bigint 8

smallint, tinyint 2,1

Numérico decimal[(p[,s])] Dec 2 -17

Exacto numeric[(p[,s])] -

float[(n)] double precisión, 8

Numérico float[(n)] para

Aproximado real n=8-15 4

float[(n)] para n=1-7

money, - 8,4

Moneda smallmoney

datetime, 8

smalldatetime 4

Fecha y hora date 4

time 4

datetime2 8

char[(n)] character [(n)] 0-8000

varchar[(n)] char VARYING[(n)]

Carácter character

VARYING[(n)]

text - 0-2 GB

nchar[(n)] - 0-8000

Caracteres nvarchar[(n)] (4000

Unicote ntext caracteres)

0-2 GB

binary [(n)] 0-8000

Binario varbinary [(n)] binary

VARYING[(n)]

Imagen Image - 0 a 2 GB

XML xml 0–2 GB

Page 27: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 27

¿Cuáles son los tipos de datos de alias?

Un tipo de datos de alias es un tipo de datos personalizada basada en un tipo de datos suministrado por el sistema. Un tipo de datos alias o definido por el usuario: ■ Le permite refinar aún más los tipos de datos para garantizar la coherencia cuando se trabaja con elementos de datos comunes en diferentes cuadros o bases de datos. ■ Es definido en una base de datos específica. ■ Debe tener un nombre único dentro de la base de datos. (Pero alias de tipos de datos con diferentes nombres pueden tener la misma definición.) Debe crear un tipo de datos definido por el usuario o alias para definir un conjunto de datos de uso común con un formato específico. Por ejemplo, una columna en la que almacenará un código de país basado en la Organización Internacional de Normalización (ISO) alfa-2 internacional para la abreviatura de nombre del país (como JP para Japón y para la CH Suiza) podría ser definido como char(2). Sin embargo, si el código del país se utilizará regularmente a lo largo de la base de datos, se podría definir un tipo de datos countryCode y se utilizaría en su lugar. Esto hace más fácil de entender las definiciones de objetos en su base de datos. Ejemplo de la creación de un tipo de datos de alias

El siguiente código ejemplo muestra cómo crear un tipo de datos alias llamado countryCode.

CREATE TYPE dbo.CountryCode FROM char(2) NULL

Page 28: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 28

Práctica: Creación de tipos de datos

Objetivo

El objetivo de esta práctica es que le permiten crear tipos de alias basado en el tipo de dato proporcionado por el sistema. Puede crear tipos de alias utilizando Explorador de objetos en SQL Server Management Studio o la instrucción CREATE TYPE de Transact-SQL. En esta práctica, se utiliza tanto técnicas para crear tipos de alias en la base de datos AdventureWorks.

Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual.

Para crear un tipo de dato mediante el uso de Transact-SQL

Realice los pasos siguientes para crear un tipo de datos definido por el usuario mediante el uso de Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. USE AdventureWorks CREATE TYPE dbo.EmailAddress FROM nvarchar(50) NULL

3. Haga clic en el botón Ejecutar en la barra de herramientas. 4. Cuando el comando se ha completado correctamente, haga clic con el definido por el usuario Tipos de datos, haga clic en la carpeta en Explorador de objetos, y luego en Actualizar para comprobar que el tipo de datos dbo.EmailAddress ha sido añadido a la base de datos.

Page 29: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 29

Creación de tablas Después de definir todos los tipos de datos para su base de datos que se requieren, puede crear las tablas necesarias para almacenar los datos. Cuando se crea una tabla, es necesario comprender cómo SQL Server físicamente organiza los datos y cómo definir las columnas para un óptimo almacenamiento y rendimiento. Cuando se crea una tabla, debe especificar el nombre de tabla, nombres de columna y tipos de datos. Los nombres de columna deben ser únicos para una tabla específica. Sin embargo, puede utilizar el mismo nombre de columna en tablas diferentes dentro de la misma base de datos. Debe especificar un conjunto de datos tipo para cada columna. Usted puede tener: ■ Más de 2 mil millones de objetos por base de datos, incluyendo tablas. ■ Hasta 1.024 columnas por tabla. ■ Hasta 8.060 bytes por fila. (Esta longitud máxima aproximada no se aplica a imagen, texto y tipos de datos ntext o columnas definidas mediante con el máximo especificado.)

Page 30: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 30

Ejemplo de la creación de una tabla

Puede crear tablas utilizando Explorador de objetos en SQL Server Management Studio o utilizando la instrucción CREATE TABLE de Transact-SQL. El siguiente código de Transact-SQL que se muestra, crea una tabla denominada CustomerOrders en un esquema llamado de Sales. La tabla incluye una columna de tipo identidad. CREATE TABLE Sales.CustomerOrders (OrderID int identity NOT NULL, OrderDate datetime NOT NULL, CustomerID int NOT NULL, Notes nvarchar(200) NULL ) Modificar y eliminar tablas Puede modificar una definición de tabla en Explorador de objetos o mediante el ALTER TABLE Transact-SQL. Por ejemplo, las siguientes sentencias Transact-SQL, muestra cómo agregar una columna y cambiar la aceptación de valores NULL de una columna en la tabla Sales.CustomerOrders definido previamente. ALTER TABLE Sales.CustomerOrders ADD SalesPersonID int NOT NULL GO ALTER TABLE Sales.CustomerOrders ALTER COLUMN Notes nvarchar(200) NOT NULL GO

Para quitar una tabla de la base de datos, puede eliminarla en Explorador de objetos o utilizar la DROP TABLE de Transact-SQL. Ejemplo: En este ejemplo se elimina la tabla titles1 y sus datos y los índices de la base de datos actual. DROP TABLE titles1

En este ejemplo se elimina la tabla autores2 en la base de datos pubs. Puede ser ejecutado desde cualquier base de datos. DROP TABLE pubs.dbo.authors2

Page 31: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 31

Práctica: Creación de tablas Objetivo

El objetivo de esta práctica es permitir que te permite crear tablas. Puede crear tablas utilizando Explorador de objetos en SQL Server Management Studio o mediante el CREATE TABLE de Transact-SQL. En esta práctica, utilizará técnicas para crear tablas en la base de datos AdventureWorks. Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual.

Para crear una tabla mediante el uso de Transact-SQL

Realice los pasos siguientes para crear una tabla mediante Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. USE AdventureWorks CREATE TABLE Sales.SpecialOffers (SpecialOfferID int IDENTITY PRIMARY KEY NOT NULL, OfferName nvarchar(25) NOT NULL, Description nvarchar(max) NULL ) 3. Haga clic en el botón Ejecutar en la barra de herramientas. 4. Cuando el comando se ha completado correctamente, haga clic en la carpeta tabla del Explorador de objetos, y luego haga clic en Actualizar para comprobar que la tabla Sales.SpecialOffers ha sido añadido a la base de datos. Otros ejercicios: 1. Crear una tabla con dos columnas y una columna de identidad como PRIMARY KEY. CREATE TABLE MyCustomers (CustID int IDENTITY (100,1) PRIMARY KEY, CompanyName nvarchar (50) ) Go 2. Crear una tabla con una columna y una restricción PRIMARY KEY. CREATE TABLE MyCustomers2 (CustID int CONSTRAINT pkCustId PRIMARY KEY ) Go

Page 32: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 32

3. Crear una tabla con una columna que haga referencia a una columna de otra tabla. CREATE TABLE MyOrders (OrderID int, CustID int REFERENCES MyCustomers(CustID) )

Page 33: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 33

Descripción general de Integridad de Datos La calidad de los datos en su base de datos determinará en gran medida la utilidad y eficacia de las aplicaciones (y personas) que dependen de ella y puede desempeñar un papel importante en el éxito o el fracaso de una organización o empresa comercial. Garantizar la integridad de los datos es un paso crítico en el mantenimiento de datos de alta calidad. Usted debe hacer cumplir la integridad de datos en todos los niveles de una aplicación desde la primera entrada hasta su almacenamiento. Microsoft ® SQL Server ™ 2008 ofrece una variedad de características que simplifican la aplicación de la integridad de los datos. Esta lección comienza con una descripción de los tipos de integridad de los datos que le conciernen como desarrollador de base de datos y un resumen de las características proporcionadas por SQL Server 2008 para satisfacer tales exigencias. A continuación, se examinan en detalle tres de los más ricas y poderosas características de integridad de datos de SQL Server 2008: restricciones, desencadenadores y esquemas XML. Un paso importante en la planificación de base de datos es decidir la mejor manera de hacer cumplir la integridad de los datos. La integridad de datos se refiere a la coherencia y la exactitud de los datos que se almacena en una base de datos. En esta lección, obtendrá información sobre los diferentes tipos de integridad de datos en una base de datos relacional y las opciones proporcionadas por SQL Server 2008 para aplicar la integridad de datos. Tipos de integridad de datos

Page 34: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 34

La ejecución de integridad de datos, garantiza la calidad de los datos en la base de datos. Los diversos tipos de integridad de los datos que debe planificar son: ■ La integridad de dominio (o columna) ■ Integridad de entidad ■ Integridad referencial La integridad de dominio.- La integridad de Dominio (o columna) especifica un conjunto de valores de datos que son válidos para una columna y determina si se permite valores nulos. La integridad de entidad.- La integridad de entidad requiere que todas las filas de una tabla tiene un identificador único, conocido como el valor de clave principal. Si el valor de clave principal se puede cambiar, o si toda la fila se puede eliminar, depende del nivel de integridad que exige entre la clave principal y cualquier otra tabla. La integridad referencial.- La integridad referencial asegura que las relaciones entre las claves principales (en la tabla de referencia) y las claves externas (en las tablas de referencia) se mantiene siempre. Una fila en una tabla de referencia no se pueden eliminar, ni la clave principal cambiarse, si un clave externa hace referencia a la fila, a menos que la acción en cascada está permitido. Se puede definir relaciones de integridad referencial dentro de la misma tabla o entre tablas separadas. Implementando Constraints.- Después de completar esta lección, los estudiantes serán capaces de: ■ Describa las restricciones. ■ Definir las restricciones PRIMARY KEY. ■ Definir restricciones DEFAULT. ■ Definir restricciones CHECK. ■ Definir restricciones UNIQUE. ■ Definir las restricciones FOREIGN KEY. ■ Definir integridad referencial en cascada. ■ Identificar razones para deshabilitar las restricciones.

Page 35: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 35

¿Cuáles son las Restricciones?

Tipo de Integridad Tipo de Restricción Destino Descripción

Dominio DEFAULT Columna

CHECK Columna

FOREIGN KEY Tabla

NULL Columna

Entidad PRIMARY KEY Tabla

UNIQUE Column

Referencial FOREIGN KEY Tabla

CHECK Columna

Define una columna o combinación de

columnas con valores que coinciden con la

clave principal de la misma u otra tabla.

Especifica los valores de datos que son

aceptables en una columna basada en los

valores de otras columnas de la misma tabla.

Identifica cada fila de manera única, asegura

que los usuarios no ingresen valores

duplicados y también se crea un índice para

mejorar el rendimiento. Los valores nulos no

están permitidos.

Evita la duplicación de la variante (no

principal) llaves y se crea un índice para

mejorar el rendimiento. se permiten valores

Especifica el valor predeterminado para la

columna cuando en una instrucción INSERT

no se proporciona un valor. La restricción

DEFAULT es la alternativa recomendada a

un objeto predeterminado.

Especifica los datos o los valores que son

aceptables en una columna. La restricción

CHECK es la alternativa recomendada a un

objeto de regla.

Especifica los valores que sean aceptables

para actualizar, con base

a los valores de una columna de otra tabla.

Especifica si el valor de una columna puede

ser NULL.

Page 36: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 36

Creando Constraint (Restricciones)

Se crea restricciones al crear una tabla mediante la instrucción CREATE TABLE. Una restricción de nivel de columna se aplica a una sola columna y es parte de la columna definición. Una restricción de nivel de tabla puede hacer referencia a uno o más columnas de la tabla. Puede modificar las restricciones en una tabla existente mediante la instrucción ALTER TABLE. Restricción Primary Key Una restricción PRIMARY KEY define una o más columnas de una tabla que constituyen una clave principal. La clave principal identifica de forma única una fila de una tabla y hace cumplir la entidad la integridad de la tabla.

El código siguiente se muestra la instrucción de Transact-SQL utilizada para crear la tabla de la HumanResources.Department de la base de datos AdventureWorks. Considere los siguientes datos antes de implementar una restricción PRIMARY KEY: ■ Una tabla sólo puede tener una restricción PRIMARY KEY. ■ Las columnas incluidas en la restricción PRIMARY KEY no puede aceptar valores nulos. ■ Los valores en las columnas especificadas en la clave principal debe ser único. Si el Restricción PRIMARY KEY contiene más de una columna, duplicados pueden aparecer en una columna, pero la combinación de los valores de todas las columnas de la PRIMARIA definición restricción de clave debe ser único. ■ Una restricción PRIMARY KEY crea un índice único con las columnas especificado como la clave del índice. Por lo tanto, las columnas elegida para la clave principal debe seguir el reglas para crear índices únicos. Puede especificar una agrupado o no agrupado índice. (Clúster es el valor predeterminado si el índice no existe.) No se puede caída del índice que apoya la restricción PRIMARY KEY. Sólo cuando se eliminar la restricción PRIMARY KEY es el índice eliminado. Este índice también permite un acceso rápido a los datos cuando la clave principal se utiliza en las consultas. CREATE TABLE [HumanResources].[Department] ( [DepartmentID] [smallint] IDENTITY(1,1) NOT NULL, [Name] [dbo].[Name] NOT NULL, [GroupName] [dbo].[Name] NOT NULL, [ModifiedDate] [datetime] NOT NULL, CONSTRAINT [PK_Department_DepartmentID] PRIMARY KEY CLUSTERED ([DepartmentID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] )

Page 37: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 37

Restricciones DEFAULT Una restricción DEFAULT introduce un valor en una columna cuando no se especifica en un valor. Considere los siguientes datos antes de implementar una restricción DEFAULT: ■ Una restricción DEFAULT sólo se aplica a las instrucciones INSERT. ■ Cada columna puede tener sólo una restricción DEFAULT. ■ Las columnas con la propiedad de identidad o el tipo de datos RowVersion no puede tener una restricción DEFAULT. CREATE TABLE [Production].[Location]( [LocationID] [smallint] IDENTITY(1,1) NOT NULL, [Name] [dbo].[Name] NOT NULL, [CostRate] [smallmoney] NOT NULL CONSTRAINT [DF_Location_CostRate] DEFAULT ((0.00)), [Availability] [decimal](8, 2) NOT NULL CONSTRAINT [DF_Location_Availability] DEFAULT ((0.00)), [ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_Location_ModifiedDate] DEFAULT (getdate()) ) Restricciones CHECK

Una restricción CHECK restringe los valores de datos que los usuarios pueden entrar en una determinada columna durante INSERT y UPDATE. Usted aplica las restricciones CHECK en el nivel de columna o tabla.

Considere los siguientes datos antes de implementar una restricción CHECK: ■ Una restricción CHECK verifica los datos cada vez que se ejecuta una instrucción INSERT o UPDATE. ■ Una restricción CHECK puede ser cualquier expresión lógica (booleana) que devuelve TRUE o FALSO. ■ Una restricción CHECK no puede contener subconsultas. ■ Una sola columna puede tener varias restricciones CHECK. ■ Una restricción CHECK no se puede colocar en las columnas con el RowVersion, texto, datos ntext o image tipos. ■ El comprobador de coherencia de base de datos (DBCC) CHECKCONSTRAINTS declaración devolverá las filas que contienen datos que infringe una restricción CHECK. Crea restricciones CHECK utilizando la columna o la cláusula CONSTRAINT de nivel de tabla de las declaraciones CREATE TABLE y ALTER TABLE. El código siguiente se muestra la instrucción de Transact-SQL utilizada para agregar una restricción CHECK para la HumanResources.EmployeeDepartmentHistory mesa de la AdventureWorks base de datos. En el ejemplo se asegura de que el valor de la columna EndDate sea igual o mayor que el valor de la columna StartDate, o que EndDate es NULL. ALTER TABLE [HumanResources].[EmployeeDepartmentHistory] WITH CHECK ADD CONSTRAINT [CK_EmployeeDepartmentHistory_EndDate] CHECK (([EndDate]>=[StartDate] OR [EndDate] IS NULL))

Page 38: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 38

Restricciones UNIQUE

Una restricción UNIQUE especifica que dos filas de una columna no puede tener el mismo valor. Una restricción UNIQUE es útil cuando usted ya tiene una clave principal, como un número de empleado, pero quiere garantizar que los identificadores, tales como un número de empleado fiscal, también son únicos. Considere los siguientes datos antes de implementar una restricción UNIQUE: ■ Sólo un valor nulo puede aparecer en una columna con una restricción UNIQUE. ■ Una tabla puede tener varias restricciones UNIQUE, mientras que sólo puede tener una sola clave principal. ■ Una restricción UNIQUE es forzada a través de la creación de un índice único sobre la la columna o columnas especificadas. Este índice no se puede permitir que la tabla superior a los 249 límite de los índices no agrupados. ■ El motor de base de datos devolverá un error si se crea una restricción UNIQUE en una columna que contiene los datos en los que se encuentran los valores duplicados. Considere el uso de una restricción UNIQUE cuando: ■ La tabla contiene columnas que no son parte de la clave primaria, pero que, individualmente o como una unidad, debe contener valores únicos. ■ La lógica empresarial dicta que los datos almacenados en una columna deben ser únicos. ■ Los datos almacenados en una columna tiene la singularidad de los valores naturales que puede contener, como los números de impuestos o el número de pasaporte. Considere el uso de una restricción UNIQUE cuando: ■ La tabla contiene columnas que no son parte de la clave primaria, pero que, individualmente o como una unidad, debe contener valores únicos. ■ La lógica empresarial dicta que los datos almacenados en una columna deben ser únicos. ■ Los datos almacenados en una columna tiene la singularidad de los valores naturales que puede contener, como los números de impuestos o el número de pasaporte. Puede crear restricciones UNIQUE mediante el uso de la cláusula UNIQUE nivel de columna de la CREATE TABLE y ALTER TABLE. El código siguiente se muestra el Transact. CREATE TABLE [HumanResources].[Employee]( [EmployeeID] [int] IDENTITY(1,1) NOT NULL, [NationalIDNumber] [nvarchar](15) NOT NULL UNIQUE NONCLUSTERED, [ContactID] [int] NOT NULL,

)

Page 39: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 39

Restricciones FOREIGN KEY

Una clave externa es una columna o combinación de columnas que se utiliza para establecer y hacer cumplir una relación entre los datos de dos tablas. Una restricción FOREIGN KEY hace cumplir esta integridad referencial. La restricción FOREIGN KEY define una referencia a una columna con una clave principal o restricción UNIQUE en la misma, u otra tabla. Los valores en la columna de clave externa deben aparecer en la columna de clave principal. Aunque existen referencias a los valores de clave principal, no pueden ser cambiados o borrados. Considere los siguientes datos antes de implementar una restricción FOREIGN KEY: ■ Una restricción FOREIGN KEY proporciona una sola columna o varias columnas de referencia integridad. La cantidad de columnas y tipos de datos que se especifican en el EXTRANJERA Exposición clave debe coincidir con el número de columnas y tipos de datos en REFERENCIAS la cláusula. ■ A diferencia de restricciones PRIMARY KEY o UNIQUE, restricciones FOREIGN KEY no crear índices de forma automática. ■ Por otro usuario para crear una restricción FOREIGN KEY en una tabla que posee, debe conceder ese permiso REFERENCIAS usuario en esa tabla. Esto asegura que no otro usuario puede restringir las operaciones en una tabla que posee mediante la creación de un FOREIGN KEY que hace referencia a su tabla. ■ Una restricción FOREIGN KEY que utiliza sólo la cláusula REFERENCES sin la Cláusula FOREIGN KEY hace referencia a una columna en la misma tabla. Puede crear restricciones FOREIGN KEY mediante el nivel de columna o de nivel de tabla RESTRICCIÓN cláusula de las declaraciones CREATE TABLE y ALTER TABLE. El siguiente código muestra la instrucción Transact-SQL utiliza para agregar una FOREIGN KEY restricción a la tabla de Sales.SalesOrderHeader de la base de datos AdventureWorks. El ejemplo, se crea una restricción FOREIGN KEY nombre FK_SalesOrderHeader_Customer_CustomerID que establece un vínculo referencial entre la columna CustomerID de la tabla Sales.SalesOrderHeader y la columna CustomerID de la tabla Sales.Customer. ALTER TABLE [Sales].[SalesOrderHeader] WITH CHECK ADD CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID] FOREIGN KEY([CustomerID]) REFERENCES [Sales].[Customer] ([CustomerID]) Consideraciones para la comprobación de restricciones

Usted debe especificar nombres significativos para las restricciones cuando se crean. Los nombres deben ser únicos para el propietario del objeto de base de datos y siga las reglas para los identificadores de SQL Server. Considere los siguientes datos al implementar o modificar las restricciones: ■ Puede crear, cambiar, sin tener que quitar y volver a crear una tabla. ■ Usted debe construir la lógica de comprobación de errores en sus aplicaciones y transacciones para poner a prueba si una restricción ha sido violada. Puede desactivar sólo CHECK y restricciones FOREIGN KEY. Usted puede ser útil desactivar las restricciones cuando: ■ Tiene que ejecutar un trabajo por lotes grandes o importación de datos y desea optimizar rendimiento. Usted necesita estar bien seguros de que los datos se ajusta a las limitaciones apropiadas o ejecutar consultas como parte de el trabajo por lotes para garantizar que los datos son correctos antes de encender las limitaciones de nuevo. ■ Se define una restricción sobre una tabla que ya contiene datos. Como resultado, cada fila de datos sólo es verificado por la restricción.

Page 40: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 40

Para deshabilitar la comprobación de restricciones cuando se agrega un CHECK o restricción FOREIGN KEY para una tabla con los datos existentes, incluya la opción WITH NOCHECK en la sentencia ALTER TABLE. Los datos existentes se verificarán únicamente durante las futuras actualizaciones de la columna. En el ejemplo siguiente se crea una restricción FOREIGN KEY en la Tabla Sales.SalesOrderHeader y utiliza la opción WITH NOCHECK para deshabilitar la verificación de los datos existentes. ALTER TABLE [Sales].[SalesOrderHeader] WITH NOCHECK ADD CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID] FOREIGN KEY([CustomerID]) REFERENCES [Sales].[Customer] ([CustomerID]) Puede desactivar la comprobación de restricciones sobre los actuales restricciones CHECK y FOREIGN KEY de modo que cualquier dato que modificar o agregar a la tabla no está marcada en contra de la restricción. Para deshabilitar una restricción CHECK y FOREIGN KEY, utiliza la sentencia ALTER TABLE y se especifica la opción NOCHECK. Lo contrario sería otra instrucción ALTER TABLE, esta vez con la opción CHECK. En este ejemplo se desactiva la restricción FK_SalesOrderHeader_Customer_CustomerID. ALTER TABLE [Sales].[SalesOrderHeader] NOCHECK CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID] En este ejemplo se vuelve a habilitar la restricción FK_SalesOrderHeader_Customer_CustomerID. ALTER TABLE [Sales].[SalesOrderHeader] CHECK CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID]

Page 41: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 41

Práctica: Creación de restricciones Objetivo

El objetivo de esta práctica es para que usted pueda crear restricciones mediante el uso de Transact-SQL. Preparación Asegúrese de que la máquina virtual se está ejecutando Si una máquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras máquinas virtuales. 2. Inicie la máquina virtual.

Para crear una restricción CHECK utilizando Transact-SQL Usted debe realizar los pasos siguientes para crear una restricción CHECK utilizando Transact-SQL: 1. En SQL Server Management Studio, si Explorador de objetos no está visible, haga clic en Objeto Explorer en el menú Ver. 2. En Explorador de objetos, expanda Bases de datos, AdventureWorks, Tablas, HumanResources.Employee, y restricciones para ver las restricciones de la tabla HumanResources.Employee. 3. Haga clic en el botón Nueva consulta en la barra de herramientas. 4. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. USE AdventureWorks GO ALTER TABLE HumanResources.Employee WITH CHECK ADD CONSTRAINT CK_Employee_Gender CHECK ((upper([Gender])='F' OR upper([Gender])='M')) 5. En la barra de herramientas, haga clic en el botón Ejecutar.

6. Cuando el comando se ha completado correctamente, haga clic en el restricciones y luego en Actualizar para comprobar que la restricción CK_Employee_Gender ha sido creada. 7. Haga clic en el botón Nueva consulta en la barra de herramientas. 8. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. USE AdventureWorks GO UPDATE HumanResources.Employee SET Gender = 'Q' WHERE EmployeeID = 1 9. En la barra de herramientas, haga clic en el botón Ejecutar. 10. Compruebe que se devuelve un error porque la actualización en conflicto con la verificación restricción. 11. Mantenga SQL Server Management Studio abierto. Lo utilizará en el siguiente

Page 42: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 42

Para crear una restricción Default mediante Transact-SQL Debe realizar los siguientes pasos para crear una restricción DEFAULT mediante Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botón Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente código de Transact-SQL. USE AdventureWorks GO ALTER TABLE HumanResources.Employee ADD CONSTRAINT DF_Employee_ModifiedDate DEFAULT (getdate()) FOR ModifiedDate 3. En la barra de herramientas, haga clic en el botón Ejecutar. 4. Cuando el comando se ha completado correctamente, haga clic en Restricciones haga clic en la carpeta en Explorador de objetos, y luego en Actualizar para comprobar que la restricción DF_Employee_ModifiedDate ha sido creada. 5. Haga clic en el botón Nueva consulta en la barra de herramientas.

Page 43: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 43

Contenidos

- Lección 01: Creación de Índices. - Lección 02: Implementación de Consultas

____________________________________________________________________________

Índices

Una vez que haya decidido lo que desea indizar y si desea usar un clúster o

índice no agrupado, debe crear el índice. Muchas opciones están disponibles para usted

cuando se crea un índice, y estos pueden tener un gran impacto en el rendimiento y el

mantenimiento del índice.

En esta lección, obtendrá información sobre cómo crear índices y cómo utilizar algunas de las

opciones de configuración de clave de índice para mejorar la utilidad, rendimiento y facilidad de

mantenimiento los índices que usted cree.

Planificando Índices

Un índice es una colección de páginas relacionadas con una tabla (o vista) se utiliza para

acelerar la recuperación de filas de la tabla o cumplir la unicidad. Microsoft ® SQL Server ™

2008 utiliza los índices para que apunte a la ubicación de una fila en una página de datos en

lugar de tener que mirar a través de todas las páginas de datos de una tabla.

Un índice contiene claves construido a partir de una o más columnas en la tabla. Estas claves

se almacena de tal manera que permite a SQL Server 2008, encontrar los registros asociados

con la clave de los valores de forma rápida y eficiente.

Page 44: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 44

En esta lección, obtendrá información sobre las tres opciones fundamentales de indexación

ofrecidos por SQL Server 2008:

Los índices agrupados, índices no agrupados e Índices únicos. Usted aprenderá las

ventajas y desventajas de cada opción y será capaz de identificar cuándo usar cada

opción.

¿Cómo es el Accesos de datos de SQL Server?

SQL accede a los datos en un servidor de dos maneras:

■ Al explorar todas las páginas de datos en una tabla, es llamada una exploración de tabla.

Cuando SQL Server realiza un recorrido de tabla, es el siguiente:

1. Comienza en el principio de la tabla.

2. Explora todas las filas de la tabla.

3. Extrae de las filas que cumplen los criterios de la consulta.

■ Cuando SQL Server utiliza un índice, es el siguiente:

1. Atraviesa la estructura de árbol de índice para encontrar registros que las solicitudes de

consulta.

2. Extrae sólo las filas necesarias que respondan a los criterios de la consulta.

Page 45: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 45

¿Qué es un índice Agrupado?

Un tipo de índice agrupado almacena filas de datos de la tabla en el orden basado en la

clave de índice agrupado. El índice agrupado se implementa como un B-tree. Cada página en

un btree se llama un nodo de índice. El nodo superior del árbol B se denomina el nodo raíz. El

nivel inferior de los nodos del índice se denomina el nivel hoja. Cualquier índice de niveles

entre el nodo raíz y los nodos hoja se conocen colectivamente como los nodos intermedios.

Cada página en los niveles intermedio o inferior tiene un puntero a la página anterior y

posterior, formando una lista doblemente enlazada. Esta estructura proporciona un mecanismo

muy eficaz para acelerar el proceso de localización de datos.

En un índice agrupado, la raíz y los nodos intermedios contienen las páginas de índice

explotación filas de índice. Cada fila de índice contiene un valor clave y un puntero a una

intermediatelevel, página en la B-árbol o una fila de datos en el nivel hoja del índice. Las

páginas de cada nivel del índice están vinculadas en una lista doblemente enlazada.

Debido a que un índice agrupado determina el orden en que las filas de tabla se almacenan

realmente, cada tabla sólo puede tener un índice agrupado las filas de la tabla no se puede

almacenar en más de un orden.

Cuando utilizar un índice agrupado

Debido a que sólo puede tener un índice agrupado por tabla, debe asegurarse de que utiliza

que para lograr el máximo beneficio posible. Antes de crear un índice agrupado,

Necesitamos entender cómo se tendrá acceso a los datos. Debido a que un índice agrupado

determina el orden en que SQL Server 2008 almacena las filas de la tabla de datos, agrupados

los índices son más adecuadas para ciertos tipos de datos y patrones de uso.

Los índices agrupados son más eficaces cuando se utilizan para apoyar las consultas que haga

lo siguiente:

■ Devolver un rango de valores mediante el uso de operadores como BETWEEN,>,> =, <, y =.

<. Debido a que la tabla de datos se almacenan físicamente en orden del índice, después de la

fila con el primer valor se encuentra utilizando el índice agrupado, las filas con la consiguiente

indexados. Los valores están garantizados para estar físicamente adyacentes.

■ Retorno de datos ordenados mediante el ORDER BY o GROUP BY. Un índice sobre la

columnas especificadas en la cláusula ORDER BY o GROUP BY puede eliminar la necesidad

de ordenar los datos porque los registros están ya clasificados. Esta mejora el rendimiento de

la consulta.

■ Retorno de datos combinados utilizando cláusulas JOIN, normalmente se trata de un campo

clave externa.

■ Volver conjuntos de resultados grandes

Consideraciones para el uso de índices agrupados

Cuando se define el índice agrupado, debe definir la clave de índice con el menor número

columnas como sea posible.

Page 46: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 46

Cuándo no utilizar índices agrupados

Los índices agrupados no son una buena opción cuando:

■ Los datos de las columnas indizadas cambian con frecuencia. Los cambios en un clúster

índice significa que toda la fila de los datos debe ser movido. Esto es una importante

consideración en los sistemas de alto volumen de procesamiento de transacciones en las que

los datos se muy volátiles.

■ La clave de índice son anchas. Las claves anchas, son las claves compuestas de varias

columnas o varias columnas de gran tamaño. Todos los índices no agrupados utilizan los

valores de la clave de la índice agrupado como claves de búsqueda. Los índices no agrupados

definidos en la misma tabla será significativamente mayor.

¿Qué es un índice no agrupado?

Los índices no agrupados tienen la misma estructura de árbol B como los índices agrupados,

excepto que las filas de datos de la tabla subyacente no se han clasificado y almacenado en el

orden basado en su clave no agrupado. En el índice no agrupado, los datos y el índice se

almacenan por separado, y el nivel hoja del índice se compone de páginas de índice en lugar

de páginas de datos.

Una tabla puede tener hasta 249 índices no agrupados. los índices no agrupados se pueden

definir sobre una tabla sin importar si utiliza un índice agrupado o no.

Cuando utilizar un índice No agrupado

Los índices no agrupados son útiles cuando los usuarios requieren múltiples formas de

búsqueda de datos. Por ejemplo, un usuario frecuente puede buscar a través de una base de

datos en busca de una jardinería tanto lo común y los nombres científicos de las plantas. Se

puede crear un índice no agrupado para la recuperación de los nombres científicos y un índice

agrupado para recuperar los nombres comunes.

Creando Índices

Una vez que haya decidido lo que desea indexar y si desea usar un clúster o índice no

agrupado, debe crear el índice. Muchas opciones están disponibles para usted cuando

se crea un índice, y estos pueden tener un gran impacto en el rendimiento y el mantenimiento

del índice.

En esta lección, obtendrá información sobre cómo crear índices y cómo utilizar algunas de las

clave de índice, opciones de configuración para mejorar la utilidad, rendimiento y facilidad de

mantenimiento de los índices que usted cree.

Para crear un índice mediante el uso de Transact-SQL, utilice la instrucción CREATE INDEX.

Sintaxis:

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) INCLUDE ( column [ ,...n ] ) [WITH [PAD_INDEX = { ON | OFF }] [[,] FILLFACTOR = fillfactor ] [[,] IGNORE_DUP_KEY = { ON | OFF }] [[,] ONLINE = { ON | OFF }] [[,] ALLOW_ROW_LOCKS = { ON | OFF }] [[,] ALLOW_PAGE_LOCKS = { ON | OFF }]] [ON {partition_scheme (column) | filegroup | “default” } ]

Page 47: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 47

El código siguiente, crea un índice no agrupado de nombre AK_Employee_LoginID,

ascendente en la columna IdDeInicioDeSesión en la tabla HumanResources.Employee

de la base de datos AdventureWorks.

CREATE NONCLUSTERED INDEX [AK_Employee_LoginID] ON [HumanResources].[Employee] ( [LoginID] ASC)

Ejercicios:

A. Crear un índice simple no agrupados.

En el ejemplo siguiente se crea un índice no agrupado en la columna BusinessEntityID

de la tabla Purchasing.ProductVendor.

USE AdventureWorks2008R2; GO IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_ProductVendor_VendorID') DROP INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor; GO CREATE INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor (BusinessEntityID); GO

B. Creación de un índice simple no agrupado y compuesto.

En el ejemplo siguiente se crea un índice no agrupado compuesto en la tabla

Sales.SalesPerson por las columnas SalesQuota y SalesYTD.

USE AdventureWorks2008R2 GO IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_SalesPerson_SalesQuota_SalesYTD') DROP INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson ; GO CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD); GO

Page 48: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 48

C. Creación de un índice único no agrupado

En el ejemplo siguiente se crea un índice único no agrupado en la columna Name de la

tabla Production.UnitMeasure. El índice permite aplicar la unicidad en los datos

insertados en la columna Name.

USE AdventureWorks2008R2; GO IF EXISTS (SELECT name from sys.indexes WHERE name = N'AK_UnitMeasure_Name') DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure; GO CREATE UNIQUE INDEX AK_UnitMeasure_Name ON Production.UnitMeasure(Name); GO

Implementación de Consultas

Las consultas permiten recuperar información de una o varias tablas de datos en forma de registros (tuplas) que se pueden almacenar en un objeto recordset, este conjunto de registros es modificable. Las consultas se implementan con el comando SQL SELECT. Las consultas pueden clasificarse de 02 tipos:

Selección.-

Cuando filtras ciertos registros, esto implica definir una condición con la cláusula WHERE.

columna1 columna2 columna3 columna4 columna5

1

2

3

4

5

6

7

8

TABLA

Proyección.- Cuando se define que columnas o campos se quiere visualizar, esto se escribe después del Comando SELECT.

columna1 columna2 columna3 columna4 columna5

1

2

3

4

5

6

7

8

TABLA

Page 49: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 49

OPERADORES RELACIONALES:

> mayor a

< menor a

>= mayor igual a

<= menor igual a

= igual que

<> diferente a

BETWEEN entre (rango)

IN en lista de valores

LIKE comparación con modelo o patrón

OPERADORES RELACIONALES

OPERADORES LÓGICOS:

AND (&&) Y

OR O

NOT Negación

OPERADORES LÓGICOS

SINTAXIS: Sintaxis 1: Consulta Simple:

SELECT lista de campos

FROM nombre de la tabla

Sintaxis 2: Consulta Condicional:

SELECT lista de campos

FROM nombre de la tabla

WHERE condición

Sintaxis 3: Consulta Ordenada:

SELECT lista de campos

FROM nombre de la tabla

ORDER BY criterio

Sintaxis 3: Consulta con predicado:

SELECT predicado lista de campos

FROM nombre de la tabla

Predicado Descripción

ALL Devuelve todos los campos de la tabla

TOP Devuelve un determinado número de registros de la tabla

DISTINCT Omite los registros cuyos campos seleccionados coincidan totalmente

Page 50: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 50

ALL Si no se incluye ninguno de los predicados se asume ALL. El motor de base de datos selecciona todos los registros que cumplen las condiciones de la instrucción SQL. No es conveniente abusar de este predicado ya que obligamos al motor de la base de datos a analizar la estructura de la tabla para averiguar los campos que contiene. Por ello, es mucho más rápido indicar el listado de campos deseados.

USE AdventureWorks2008R2; GO SELECT ALL * FROM HumanResources.Employee; GO

TOP Devuelve un cierto número de registros que entran al principio o al final de un rango especificado por una cláusula ORDER BY. Supongamos que queremos recuperar los nombres de los cinco (05) primeros recordset de la tabla Employee.

USE AdventureWorks2008R2; GO SELECT TOP 5 * FROM HumanResources.Employee; GO

Se puede también hacer uso de la cláusula Top Percent, para indicar un porcentaje.

USE AdventureWorks2008R2; GO SELECT TOP 50 PERCENT * FROM HumanResources.Employee; GO

DISTINCT Omite los registros que contienen datos duplicados en los campos seleccionados. Para que los valores de cada campo listado en la instrucción SELECT se incluyan en la consulta deben ser únicos.

USE AdventureWorks2008R2; GO SELECT DISTINCT JobTitle FROM HumanResources.Employee ORDER BY JobTitle; GO

ALIAS En determinadas circunstancias es necesario asignar un nombre a alguna columna determinada de un conjunto devuelto, otras veces por un tema de entendimiento o por otra circunstancias. Para resolver todas ellas tenemos la palabra reservada AS que se encarga de asignar el nombre que deseamos a la columna deseada. Por ejemplo: En la siguiente consulta se asignó alias a las columnas, inclusive a la tabla.

Page 51: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 51

USE AdventureWorks2008R2; GO SELECT Name AS [Nombre de Producto],

ProductNumber As „NumeroProducto‟, ListPrice AS Precio

FROM Production.Product As Producto ORDER BY Name ASC; GO

XML En SQL Server 2008, el resultado de una consulta FOR XML se devuelve siempre

directamente al cliente en forma de texto. Gracias a la compatibilidad con el tipo de datos xml de SQL Server 2008, existe la opción de solicitar la devolución del resultado de una consulta FOR XML como tipo de datos xml especificando la directiva TYPE. Cláusulas:

RAW [('ElementName')] Obtiene el resultado de la consulta y transforma cada fila del conjunto de resultados en un elemento XML con un identificador genérico <row /> como etiqueta del elemento. Opcionalmente, puede especificar un nombre para el elemento de fila cuando se utiliza esta directiva. El XML resultante utilizará el ElementName especificado como el elemento de fila generado para cada fila..

USE AdventureWorks2008R2; GO SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID=122 or ProductModelID=119 FOR XML RAW; GO

El resultado sería así:

<row ProductModelID="122" Name="All-Purpose Bike Stand" /> <row ProductModelID="119" Name="Bike Wash" />

AUTO Devuelve los resultados de la consulta en un árbol anidado XML sencillo. Cada tabla en la cláusula FROM de la que al menos se presenta una columna en la cláusula SELECT se representa como un elemento XML. A las columnas presentadas en la cláusula SELECT se les asignan los atributos de elemento apropiados.

SELECT Cust.CustomerID, OrderHeader.CustomerID, OrderHeader.SalesOrderID, OrderHeader.Status, Cust.CustomerType FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader WHERE Cust.CustomerID = OrderHeader.CustomerID ORDER BY Cust.CustomerID FOR XML AUTO

Page 52: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 52

Éste es el resultado parcial: <Cust CustomerID="1" CustomerType="S"> <OrderHeader CustomerID="1" SalesOrderID="43860" Status="5" /> <OrderHeader CustomerID="1" SalesOrderID="44501" Status="5" /> <OrderHeader CustomerID="1" SalesOrderID="45283" Status="5" /> <OrderHeader CustomerID="1" SalesOrderID="46042" Status="5" /> </Cust>

EXPLICIT Especifica que la forma del árbol XML resultante está definida explícitamente. Con este modo, es necesario escribir las consultas de una cierta manera, de modo que se pueda especificar explícitamente información adicional acerca de la anidación deseada.

PATH

Facilita la mezcla de elementos y atributos, así como la especificación de anidación adicional para representar propiedades complejas. Puede utilizar consultas FOR XML de modo EXPLICIT para construir XML a partir de un conjunto de filas, pero el modo PATH supone una alternativa más simple a las consultas de modo EXPLICIT potencialmente complicadas. El modo PATH, junto con la posibilidad de escribir consultas FOR XML anidadas y la directiva TYPE para devolver instancias de tipo xml, permite escribir consultas de forma más fácil. Ofrece una alternativa para escribir la mayoría de las consultas de modo EXPLICIT. De forma predeterminada, el modo PATH genera un contenedor de elementos <row> para cada fila del conjunto de resultados. También se puede especificar un nombre de elemento. En este caso, el nombre especificado se utilizará como nombre del elemento contenedor. Si se proporciona una cadena vacía (FOR XML PATH ('')), no se generará ningún elemento contenedor.

SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID=122 or ProductModelID=119 FOR XML PATH ('ProductModel') Go

El XML resultante tendrá un nombre de elemento de fila especificado.

<ProductModel> <ProductModelID>122</ProductModelID> <Name>All-Purpose Bike Stand</Name> </ProductModel> <ProductModel> <ProductModelID>119</ProductModelID> <Name>Bike Wash</Name> </ProductModel>

XMLDATA Especifica que se debe devolver un esquema XDR (XML-Data Reduced) insertado. El esquema se antepone al documento como un esquema insertado. Para obtener un ejemplo funcional, vea Usar el modo RAW.

XMLSCHEMA Devuelve un esquema XML W3C (XSD) insertado. Opcionalmente, puede especificar un URI de espacio de nombres de destino al especificar esta directiva. De este modo, se devuelve el espacio de nombres especificado en el esquema.

Page 53: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 53

ELEMENTS Si se especifica la opción ELEMENTS, las columnas se devuelven como subelementos. Sin embargo, se les asignan atributos XML. Esta opción solo se admite en los modos RAW, AUTO y PATH. También puede especificar XSINIL o ABSENT cuando utilice esta directiva. XSINIL especifica que se puede crear un elemento con un atributo xsi:nil establecido en True para los valores de columna NULL. De forma predeterminada, o cuando se especifica ABSENT junto con ELEMENTS, no se crea ningún elemento para los valores NULL.

SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID=122 or ProductModelID=119 FOR XML RAW, ELEMENTS

TYPE

Especifica que la consulta devuelve los resultados como el tipo xml.

SELECT ContactID, FirstName, LastName, Phone FROM Person.Contact ORDER BY ContactID FOR XML AUTO, TYPE

El resultado sería:

<Contact ContactID="1" FirstName="Syed" LastName="Abbas" Phone="398-555-0132"/> <Contact ContactID="2" FirstName="Catherine" LastName="Abel" Phone="747-555-0171"/> ...

ROOT [('RootName')] Especifica que se puede agregar un solo elemento de nivel superior al XML resultante. También se puede especificar el nombre del elemento raíz que se generará. El valor predeterminado es "root".

SELECT ContactID, FirstName, LastName, Phone FROM Person.Contact ORDER BY ContactID FOR XML AUTO, TYPE, ROOT („Contact‟)

Page 54: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 54

Funciones Integradas de SQL Server 2008

SQL Server proporciona numerosas funciones integradas y permite crear funciones definidas

por el usuario. En esta página se muestra una lista de las categorías integradas.

Entre ellas, se tiene a las funciones de agregado, de conversión, de cadena, matemáticas, etc.

Se hará un reconocimiento de las funciones cadena, fecha y conversión,

Funciones de cadena

Estas funciones escalares realizan una operación sobre un valor de cadena de entrada y

devuelven un valor de cadena o un valor numérico:

ASCII Devuelve el valor de código ASCII del carácter situado más a la izquierda de una

expresión de caracteres.

Sintaxis ASCII ( character_expression )

Ejemplo:

Print ASCII(„A‟)

CHAR Devuelve el carácter de un código ASCII.

Sintaxis CHAR ( código_ASCII )

Ejemplo:

Print CHAR(66)

LEFT Devuelve la parte izquierda de una cadena de caracteres según el número de

caracteres especificado

Sintaxis LEFT ( expresión_cadena, número_de_caracteres)

Ejemplo:

USE AdventureWorks2008R2; GO SELECT LEFT(Name, 5) FROM Production.Product ORDER BY ProductID; GO

SELECT LEFT('abcdefg',2) GO

Page 55: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 55

LEN Devuelve el número de caracteres de la expresión de cadena especificada, con

exclusión de los espacios al final.

Sintaxis LEN ( expresión_cadena)

Ejemplo:

USE AdventureWorks2008R2; GO SELECT LEN(FirstName) AS Length, FirstName, LastName FROM Sales.vIndividualCustomer WHERE CountryRegionName = 'Australia'; GO

LOWER Devuelve una expresión de cadena especificada, convertida a minúscula.

Sintaxis LOWER ( expresión_cadena)

Ejemplo:

USE AdventureWorks2008R2; GO SELECT LOWER(SUBSTRING(Name, 1, 20)) AS Lower, UPPER(SUBSTRING(Name, 1, 20)) AS Upper, LOWER(UPPER(SUBSTRING(Name, 1, 20))) As LowerUpper FROM Production.Product WHERE ListPrice between 11.00 and 20.00; GO

LTRIM Devuelve una expresión de caracteres tras quitar todos los espacios iniciales en

blanco.

Sintaxis LTRIM ( expresión_cadena)

Ejemplo:

PRINT LTRIM(„ Bienvenido a SQL Developer Edition‟)

NCHAR Devuelve el carácter Unicode correspondiente al código entero dado.

Sintaxis NCHAR ( valor_entero )

Ejemplo:

PRINT NCHAR(248)

Page 56: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 56

PATINDEX Devuelve la posición inicial de la primera aparición de un patrón en una expresión

especificada o ceros si el patrón no se encuentra, de todos los textos válidos y tipos de

datos de caracteres.

Sintaxis PATINDEX ( '%patrón%' , expresión )

Ejemplo:

PRINT PATINDEX('%au%','Jose Maurinho')

REPLACE Reemplaza todas las instancias de un valor de cadena especificado por otro valor de

cadena.

Sintaxis REPLACE ( expresión_cadena, patrón_cadena, cadena_a_reemplazar )

Ejemplo:

SELECT REPLACE('abcdefghicde','cde','xxx'); GO

REPLICATE Repite un valor de cadena, un número determinado de veces.

Sintaxis REPLICATE ( expresión_cadena, valor_entero )

Ejemplo:

USE AdventureWorks2008R2; GO SELECT [Name] , REPLICATE('0', 4) + [ProductLine] AS 'Line Code' FROM [Production].[Product] WHERE [ProductLine] = 'T' ORDER BY [Name]; GO

REVERSE Devuelve el inverso de un valor de cadena.

Sintaxis REVERSE ( expresión_cadena)

Page 57: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 57

Ejemplo:

USE AdventureWorks2008R2; GO SELECT FirstName, REVERSE(FirstName) AS Reverse FROM Person.Person WHERE BusinessEntityID < 5 ORDER BY FirstName; GO

RIGHT Devuelve la parte derecha de una cadena de caracteres, según el número de

caracteres especificado

Sintaxis

LEFT ( expresión_cadena, número_de_caracteres)

Ejemplo:

USE AdventureWorks2008R2; GO SELECT RIGHT(FirstName, 5) AS 'First Name' FROM Person.Person WHERE BusinessEntityID < 5 ORDER BY FirstName; GO

RTRIM Devuelve una cadena de caracteres después de truncar todos los espacios en blanco

finales.

Sintaxis

RTRIM ( expresión_cadena)

Ejemplo:

PRINT LTRIM(„Excelente Motor de Base de Datos ‟)

SPACE Devuelve una cadena de espacios repetidos.

Sintaxis SPACE ( valor_entero)

Ejemplo:

USE AdventureWorks2008R2; GO SELECT RTRIM(LastName) + ',' + SPACE(2) + LTRIM(FirstName) FROM Person.Person ORDER BY LastName, FirstName; GO

Page 58: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 58

STR Devuelve datos de caracteres convertidos a partir de datos numéricos.

Sintaxis STR ( valor_float, longitud, cantidad_decimales)

Ejemplo:

PRINT STR(7559.5670, 7, 2) STUFF

La función STUFF inserta una cadena en otra. Elimina una longitud determinada de

caracteres de la primera cadena a partir de la posición de inicio y, a continuación,

inserta la segunda cadena en la primera, en la posición de inicio.

Sintaxis STUFF ( expresión_cadena, inicio, longitud , expresión_cadena2 )

Ejemplo:

PRINT STUFF('abcdef', 2, 3, 'ijklmn'); GO

SUBSTRING Devuelve una cadena a partir de otra, desde una determinada posición, cierta cantidad

de caracteres.

Sintaxis SUBSTRING ( expresión_cadena, posición_inicial, longitud)

Ejemplo:

PRINT SUBSTRING('Walter Javier',8,4) GO

UNICODE Devuelve el valor entero, según la definición del estándar Unicode, para el primer

carácter de la expresión de entrada.

Sintaxis UNICODE ( carácter_Unicode )

Ejemplo:

PRINT UNICODE('и')

GO

UPPER Devuelve una expresión de caracteres minúsculas convertidos en mayúsculas.

Sintaxis UPPER ( expresión_cadena )

Page 59: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 59

Ejemplo:

USE AdventureWorks2008R2; GO SELECT UPPER(RTRIM(LastName)) + ', ' + FirstName AS Name FROM Person.Person ORDER BY LastName; GO

Page 60: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 60

Funciones de fecha y hora

En las tablas siguientes se enumeran las funciones de fecha y hora de Transact-SQL.

Funciones que obtienen valores de fecha y hora del sistema Todos los valores de fecha y hora del sistema se derivan del sistema operativo del equipo en el

que se ejecuta la instancia de SQL Server.

Funciones de fecha y hora del sistema de precisión elevada SQL Server 2008 obtiene los valores de fecha y hora utilizando la API de Windows

GetSystemTimeAsFileTime(). La exactitud depende del hardware del equipo y de la versión

de Windows en las que la instancia de SQL Server se esté ejecutando. La precisión de esta

API se fija en 100 nanosegundos. La precisión se puede determinar mediante la API de

Windows GetSystemTimeAdjustment().

Page 61: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 61

Función Sintaxis Valor devuelto Tipo de datos

devuelto

Determinismo

http://msdn.microsoft.com/es-

es/library/bb630353.aspx

SYSDATETIME () Devuelve un

valor

datetime2(7) que

contiene la fecha

y hora del equipo

en el que la

instancia de SQL

Server se está

ejecutando. El

ajuste de zona

horaria no está

incluido.

datetime2(7) No

determinista

http://msdn.microsoft.com/es-

es/library/bb677334.aspx

SYSDATETIMEOFFSET

( )

Devuelve un

valor

datetimeoffset(7

) que contiene la

fecha y hora del

equipo en el que

la instancia de

SQL Server se

está ejecutando.

El ajuste de zona

horaria está

incluido.

datetimeoffset(7) No

determinista

http://msdn.microsoft.com/es-

es/library/bb630387.aspx

SYSUTCDATETIME ( ) Devuelve un

valor

datetime2(7) que

contiene la fecha

y hora del equipo

en el que la

instancia de SQL

Server se está

ejecutando. La

fecha y hora se

devuelven como

hora universal

coordinada

(UTC).

datetime2(7) No

determinista

Page 62: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 62

Funciones de fecha y hora del sistema de precisión baja

Función Sintaxis Valor

devuelto

Tipo de

datos

devuelto

Determinismo

http://msdn.microsoft.com/es-

es/library/ms188751.aspx

CURRENT_TIMESTAMP Devuelve un

valor

datetime2(7

) que

contiene la

fecha y hora

del equipo

en el que la

instancia de

SQL Server

se está

ejecutando.

El ajuste de

zona horaria

no está

incluido.

datetime No

determinista

GETDATE GETDATE ( ) Devuelve un

valor

datetime2(7

) que

contiene la

fecha y hora

del equipo

en el que la

instancia de

SQL Server

se está

ejecutando.

El ajuste de

zona horaria

no está

incluido.

datetime No

determinista

GETUTCDATE GETUTCDATE ( ) Devuelve un

valor

datetime2(7

) que

contiene la

fecha y hora

datetime No

determinista

Page 63: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 63

Funciones que obtienen partes de la fecha y hora

Función Sintaxis Valor devuelto Tipo de

datos

devuelto

Determinismo

DATENAME DATENAME (

datepart , date )

Devuelve una cadena de

caracteres que representa el

datepart especificado de la

fecha especificada.

nvarchar No

determinista

DATEPART DATEPART (

datepart , date )

Devuelve un entero que

representa el datepart

especificado del date

especificado.

int No

determinista

DAY DAY ( date ) Devuelve un entero que

representa la parte del día de

date especificado.

int Determinista

MONTH MONTH ( date ) Devuelve un entero que

representa la parte del mes de

un date especificado.

int Determinista

YEAR YEAR ( date ) Devuelve un entero que

representa la parte del año de

un date especificado.

int Determinista

Funciones que obtienen diferencias de fecha y hora

Función Sintaxis Valor devuelto Tipo de

datos

devuelto

Determinismo

DATEDIFF DATEDIFF (

datepart , startdate

, enddate )

Devuelve el número de límites

datepart de fecha y hora entre

dos fechas especificadas.

int Determinista

Page 64: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 64

Funciones que modifican valores de fecha y hora

Función Sintaxis Valor devuelto Tipo de datos

devuelto

Determinismo

DATEADD DATEADD

(datepart , number

, date )

Devuelve un nuevo

valor datetime

agregando un

intervalo al

datepart

especificado del

dateespecificado.

El tipo de datos

del argumento

date.

Determinista

http://msdn.microsoft.com/es-

es/library/bb677244.aspx

SWITCHOFFSET

(DATETIMEOFFSET ,

time_zone)

SWITCH OFFSET

cambia el ajuste de

zona horaria de un

valor

DATETIMEOFFSET y

conserva el valor

UTC.

datetimeoffset

con la precisión

fraccionaria de

DATETIMEOFFSE

T

Determinista

http://msdn.microsoft.com/es-

es/library/bb630335.aspx

TODATETIMEOFFSET

(expression ,

time_zone)

TODATETIMEOFFSET

transforma un valor

datetime2 en un

valor datetimeoffset.

El valor datetime2

se interpreta en la

hora local para el

valor time_zone

especificado.

datetimeoffset

con la precisión

fraccionaria del

argumento

datetime

Determinista

Page 65: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 65

Funciones que establecen u obtienen un formato de sesión

Función Sintaxis Valor devuelto Tipo de

datos

devuelto

Determinism

o

http://msdn.microsoft.com/es

-es/library/ms187766.aspx

@@DATEFIRS

T

Devuelve el

valor actual,

para la sesión,

de SET

DATEFIRST.

tinyint No

determinista

http://msdn.microsoft.com/es

-es/library/ms181598.aspx

SET

DATEFIRST {

number |

@number_var }

Establece el

primer día de la

semana en un

número del 1 al

7.

No

aplicabl

e

No aplicable

http://msdn.microsoft.com/es

-es/library/ms189491.aspx

SET

DATEFORMAT {

format |

@format_var }

Determina el

orden de los

componentes de

la fecha

(mes/día/año)

para escribir

datos de tipo

datetime o

smalldatetime.

No

aplicabl

e

No aplicable

http://msdn.microsoft.com/es

-es/library/ms177557.aspx

@@LANGUAG

E

Devuelve el

nombre del

idioma que se

está utilizando

actualmente.

@@LANGUAG

E no es ninguna

función de fecha

u hora. Sin

embargo, la

configuración de

idioma puede

afectar a la

salida de las

funciones de

No

aplicabl

e

No aplicable

Page 66: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 66

fecha.

http://msdn.microsoft.com/es

-es/library/ms174398.aspx

SET

LANGUAGE { [

N ] 'language' |

@language_var

}

Establece el

entorno del

idioma de la

sesión y los

mensajes del

sistema. SET

LANGUAGE no

es ninguna

función de fecha

u hora. Sin

embargo, la

configuración de

idioma afecta a

la salida de las

funciones de

fecha.

No

aplicabl

e

No aplicable

Funciones que validan valores de fecha y hora

Función Sintaxis Valor devuelto Tipo de

datos

devuelto

Determinismo

http://msdn.microsoft.com/es-

es/library/ms187347.aspx

ISDATE (

expression

)

Determina si una

expresión de

entrada datetime

o smalldatetime

es un valor de

fecha u hora

válido.

int ISDATE sólo es

determinista si se

utiliza con la

función

CONVERT,

cuando se

especifica el

parámetro de

estilo CONVERT

y cuando el estilo

no es igual a 0,

100, 9 ni 109.

Page 67: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 67

Funciones de Conversión

Utilice las funciones CAST y CONVERT para convertir expresiones de un tipo de datos a otro

tipo de datos.

Las funciones CAST y CONVERT también se puede utilizar para obtener una variedad de

formatos de datos especiales y se pueden utilizar en la lista de selección, en la cláusula

WHERE y en cualquier lugar que se permita una expresión.

Sintaxis de CAST:

CAST ( expresión AS nuevo_tipo_dato [( longitud )] )

Sintaxis de CONVERT:

CONVERT ( nuevo_tipo_dato [ ( longitud ) ] , expresión [ , style ]

Ejemplos:

--Usando CAST USE AdventureWorks2008R2; GO SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice FROM Production.Product WHERE CAST(ListPrice AS int) LIKE '3%'; GO

-- Usando CONVERT. USE AdventureWorks2008R2; GO SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice FROM Production.Product WHERE CONVERT(int, ListPrice) LIKE '3%'; GO

Page 68: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 68

Arreglos

Contenidos

- Lección 1: Consultas multitablas - Lección 2: Subconsultas

____________________________________________________________________________

Consultas Multitablas La consultas multitablas es un requerimiento fundamental en los negocios de hoy en día, dado a que se quiere obtener información de diferentes tablas y para ello se deben combinar mediante campos comunes que tienen entre ellas.

Mediante el uso de combinaciones, puede recuperar los datos de dos o más tablas basadas en relaciones lógicas entre las tablas. Una condición de combinación define la forma en que las dos tablas están relacionadas en una consulta, por ello se debe: • Especificar la columna de cada tabla que se utilizará para la combinación. Una unión típica, es la condición donde se indica la clave externa de una tabla y la clave asociada en la otra tabla (PK). • Especificar un operador lógico (por ejemplo, = o <>,) para ser utilizado en la comparación de los valores de las columnas.

Page 69: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 69

Las vinculaciones entre tablas se realizan mediante la cláusula JOIN que combina registros de dos tablas siempre que haya concordancia de valores en un campo común. Su sintaxis es de la siguiente forma: SELECT lista de campos FROM tb1 JOIN tb2 ON tb1.campo1 comp tb2.campo2 En donde: tb1, tb2

Son los nombres de las tablas desde las que se combinan los registros. campo1, campo2

Son los nombres de los campos que se combinan. Si no son numéricos, los campos deben ser del mismo tipo de datos y contener el mismo tipo de datos, pero no tienen que tener el mismo nombre.

comp

Es cualquier operador de comparación relacional: =, <, >, <=, >=, o <>. Ejemplo 1: USE AdventureWorks2008R2; GO SELECT * FROM HumanResources.Employee AS e JOIN Person.Contact AS c ON e.ContactID = c.ContactID ORDER BY c.LastName

Se muestra como resultado registros de ambas tablas, de la combinación de los campos ContactID. Ejemplo 2. La combinación no igual (<>) se usa con poca frecuencia. Como regla general, las combinaciones no igual sólo tienen sentido cuando se usan con una autocombinación. Por ejemplo, esta combinación no igual Transact-SQL y la autocombinación se usan para encontrar las subcategorías que tienen al menos dos precios diferentes USE AdventureWorks2008R2; GO SELECT DISTINCT p1.ProductSubcategoryID, p1.ListPrice FROM Production.Product p1 JOIN Production.Product p2 ON p1.ProductSubcategoryID = p2.ProductSubcategoryID AND p1.ListPrice <> p2.ListPrice ORDER BY ProductSubcategoryID; Se puede utilizar una operación INNER JOIN en cualquier cláusula FROM. Esto crea una combinación por equivalencia, conocida también como unión interna. Las combinaciones aquí son las más comunes; éstas combinan los registros de dos tablas siempre que haya concordancia de valores en un campo común a ambas tablas. Se puede utilizar INNER JOIN con las tablas DEPARTAMENTOS y EMPLEADOS para seleccionar todos los empleados de cada departamento. Por el contrario, para seleccionar todos los DEPARTAMENTOS (incluso si alguno de ellos no tiene ningún empleado asignado) se emplea LEFT JOIN o todos los empleados (incluso si alguno no está asignado a ningún departamento), en este caso RIGHT JOIN.

Page 70: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 70

También, puede anidar instrucciones JOIN utilizando la siguiente sintaxis: SELECT campos FROM tabla1 JOIN tabla2

ON tb1.campo1 comp tb2.campo2 INNER JOIN tabla3 ON tb2.campo2 comp tb3.campo3)]

Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro de un INNER JOIN, pero

un INNER JOIN no puede anidarse dentro de un LEFT JOIN o un RIGHT JOIN. Ejemplo:

USE AdventureWorks2008R2; GO SELECT Co.FirstName, Co.LastName, Cc.CardType , Cc.CardNumber , Cc.ExpMonth, Cc.ExpYear, CoCc.ModifiedDate FROM Person.Contact Co JOIN Sales.ContactCreditCard CoCc ON Co.ContactID = CoCc.ContactID JOIN Sales.CreditCard Cc ON CoCc.CreditCardID = Cc.CreditCardID WHERE Cc.ExpYear = 2008 and Cc.ExpMonth =12 Las combinaciones se pueden clasificar en:

Combinaciones internas (la operación de combinación típica, que usa algunos operadores de comparación como = o <> ). INNER JOIN En este tipo se incluyen las combinaciones equivalentes y las combinaciones naturales. Las combinaciones internas usan un operador de comparación para hacer coincidir las filas de dos tablas según los valores de las columnas comunes de cada tabla. Un ejemplo sería recuperar todas las filas en las que el número de identificación de estudiante es el mismo en las tablas students y courses. Ejemplo: Recupera los empleados que también son vendedores: USE AdventureWorks; GO SELECT e.EmployeeID FROM HumanResources.Employee AS e INNER JOIN Sales.SalesPerson AS s ON e.EmployeeID = s.SalesPersonID

Page 71: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 71

Combinaciones externas. Puede ser una combinación externa izquierda, derecha o completa. Las combinaciones externas se especifican en la cláusula FROM con uno de los siguientes conjuntos de palabras clave:

LEFT JOIN o LEFT OUTER JOIN. El conjunto de resultados de una combinación externa izquierda incluye todas las filas de la tabla de la izquierda especificada en la cláusula LEFT OUTER y no sólo aquellas en las que coincidan las columnas combinadas. Cuando una fila de la tabla de la izquierda no tiene filas coincidentes en la tabla de la derecha, la fila asociada del conjunto de resultados contiene valores NULL en todas las columnas de la lista de selección que procedan de la tabla de la derecha. Ejemplo: Imagine una combinación de la tabla Product y de la tabla ProductReview en sus columnas ProductID. Los resultados muestran solamente los productos para los que se han escrito revisiones. Para incluir todos los productos, independientemente de si se ha escrito una revisión para alguno de ellos, utilice una combinación externa izquierda. Ésta es la consulta: USE AdventureWorks; GO SELECT p.Name, pr.ProductReviewID FROM Production.Product p LEFT OUTER JOIN Production.ProductReview pr ON p.ProductID = pr.ProductID

RIGHT JOIN o RIGHT OUTER JOIN. Una combinación externa derecha es lo contrario de una combinación externa izquierda. Se devuelven todas las filas de la tabla de la derecha. Cada vez que una fila de la tabla de la derecha no tenga correspondencia en la tabla de la izquierda, se devuelven valores NULL para la tabla de la izquierda. Ejemplo 1: Imagine una combinación de la tabla SalesTerritory y de la tabla SalesPerson en sus columnas TerritoryID. Los resultados pueden mostrar cualquier territorio de ventas asignado a un vendedor. El operador ISO de combinación externa derecha, RIGHT OUTER JOIN, indica que todas las filas de la segunda tabla se deben incluir en los resultados, con independencia de si hay datos coincidentes en la primera tabla. Para incluir a todos los vendedores en los resultados, independientemente de si están asignados a un territorio de ventas, utilice una combinación externa derecha ISO. A continuación se muestra la consulta Transact-SQL y los resultados de la combinación externa derecha. USE AdventureWorks; GO SELECT st.Name AS Territory, sp.SalesPersonID FROM Sales.SalesTerritory st RIGHT OUTER JOIN Sales.SalesPerson sp ON st.TerritoryID = sp.TerritoryID

Page 72: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 72

Ejemplo 2: Una combinación externa puede restringirse más mediante el uso de un predicado WHERE. Este ejemplo contiene la misma combinación externa derecha, pero sólo incluye los territorios de ventas con un volumen de ventas inferior a 2.000.000 de dólares: USE AdventureWorks; GO SELECT st.Name AS Territory, sp.SalesPersonID FROM Sales.SalesTerritory st RIGHT OUTER JOIN Sales.SalesPerson sp ON st.TerritoryID = sp.TerritoryID WHERE st.SalesYTD < $2000000 FULL JOIN o FULL OUTER JOIN. Una combinación externa completa devuelve todas las filas de las tablas de la izquierda y la derecha. Cada vez que una fila no tenga coincidencia en la otra tabla, las columnas de la lista de selección de la otra tabla contendrán valores NULL. Cuando haya una coincidencia entre las tablas, la fila completa del conjunto de resultados contendrá los valores de datos de las tablas base. Ejemplo: Imagine una combinación de la tabla Product y de la tabla SalesOrderDetail en sus columnas ProductID. Los resultados sólo muestran los productos para los que se han efectuado pedidos de venta. El operador de combinación externa completa, FULL OUTER JOIN, indica que todas las filas de ambas tablas se van a incluir en los resultados, con independencia de que haya datos coincidentes en las tablas. Puede incluir una cláusula WHERE con una combinación externa completa para devolver solamente las filas donde no hay datos coincidentes entre las tablas. La siguiente consulta sólo devuelve los productos que no tienen pedidos de venta que coincidan, así como los pedidos de venta que no coinciden con ningún producto (aunque todos los pedidos de venta, en este caso, coincidan con un producto). USE AdventureWorks; GO SELECT p.Name, sod.SalesOrderID FROM Production.Product p FULL OUTER JOIN Sales.SalesOrderDetail sod ON p.ProductID = sod.ProductID WHERE p.ProductID IS NULL OR sod.ProductID IS NULL ORDER BY p.Name ;

Combinaciones cruzadas Las combinaciones cruzadas devuelven todas las filas de la tabla izquierda. Cada fila de la tabla izquierda se combina con todas las filas de la tabla de la derecha. Las combinaciones cruzadas (CROSS JOIN) se llaman también productos cartesianos. Ejemplo 1: Una combinación cruzada que no tenga una cláusula WHERE genera el producto cartesiano de las tablas involucradas en la combinación. El tamaño del conjunto de resultados de un producto cartesiano es igual al número de filas de la primera tabla multiplicado por el número de filas de la segunda tabla. En el siguiente ejemplo se muestra una combinación cruzada de Transact-SQL.

Page 73: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 73

USE AdventureWorks; GO SELECT p.SalesPersonID, t.Name AS Territory FROM Sales.SalesPerson p CROSS JOIN Sales.SalesTerritory t ORDER BY p.SalesPersonID;

El conjunto de resultados contiene 170 filas (SalesPerson tiene 17 filas y SalesTerritory tiene 10; 17 multiplicado por 10 es igual a 170).

Ejemplo 2: Sin embargo, si se agrega una cláusula WHERE, la combinación cruzada se comporta como una combinación interna. Por ejemplo, las siguientes consultas Transact-SQL producen el mismo conjunto de resultados. USE AdventureWorks; GO SELECT p.SalesPersonID, t.Name AS Territory FROM Sales.SalesPerson p CROSS JOIN Sales.SalesTerritory t WHERE p.TerritoryID = t.TerritoryID ORDER BY p.SalesPersonID; -- Or USE AdventureWorks; GO SELECT p.SalesPersonID, t.Name AS Territory FROM Sales.SalesPerson p INNER JOIN Sales.SalesTerritory t ON p.TerritoryID = t.TerritoryID ORDER BY p.SalesPersonID;

Page 74: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 74

Subconsultas Anidadas Una subconsulta es una consulta que está anidado dentro de un SELECT, INSERT, UPDATE o DELETE, o dentro de otra subconsulta. Una subconsulta puede utilizarse en cualquier lugar se permita una expresión. En este ejemplo se utiliza una subconsulta como una expresión de columna denominada MaxUnitPrice en una instrucción SELECT. USE AdventureWorks2008R2; GO SELECT Ord.SalesOrderID, Ord.OrderDate, (SELECT MAX(OrdDet.UnitPrice) FROM AdventureWorks.Sales.SalesOrderDetail AS OrdDet WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice FROM AdventureWorks2008R2.Sales.SalesOrderHeader AS Ord Una subconsulta es también llamado una consulta interna o interior seleccione, mientras que la declaración que contiene una subconsulta también se llama una consulta externa o exterior. SELECT Name FROM AdventureWorks2008R2.Production.Product WHERE ListPrice IN ( SELECT ListPrice FROM AdventureWorks2008R2.Production.Product WHERE Name = 'Chainring Bolts' ); Una subconsulta anidada en la instrucción SELECT externa tiene los siguientes componentes:

• Una consulta regular SELECCIONAR incluidos los componentes lista de selección regular. • Una cláusula FROM periódicos, incluyendo uno o más nombres de tabla o vista. • Una cláusula WHERE opcional. • Una cláusula GROUP BY opcional. • Una cláusula HAVING opcional

La consulta SELECT de una subconsulta es siempre entre paréntesis. No puede incluir una cláusula COMPUTE o FOR BROWSE, y sólo puede incluir una cláusula ORDER BY cuando una cláusula TOP también se especifica. Una subconsulta puede anidarse dentro de la cláusula WHERE o HAVING de una SELECT externa, INSERT, UPDATE o DELETE, o dentro de otra subconsulta. Hasta 32 niveles de anidamiento es posible, aunque el límite varía según la memoria disponible y la complejidad de otras expresiones en la consulta. consultas individuales no pueden apoyar anidación hasta 32 niveles. Una subconsulta puede aparecer en cualquier lugar una expresión puede ser utilizada, si devuelve un valor único. Las declaraciones que incluyen una subconsulta suelen tener uno de estos formatos: •WHERE expression [NOT] IN (subconsulta) •WHERE expression comparison_operator [ANY | ALL] (subconsulta) •WHERE [NOT] EXISTS (subconsulta)

Page 75: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 75

Ejemplo 1: La siguiente consulta encuentra el nombre de todos los proveedores cuya calificación crediticia es buena, de quien Adventure Works ordenó por lo menos 20 items, y un promedio de tiempo de entrega inferior a 16 días. Use AdventureWorks2008R2; GO SELECT Name FROM Purchasing.Vendor WHERE CreditRating = 1 AND VendorID IN ( SELECT VendorID FROM Purchasing.ProductVendor WHERE MinOrderQty >= 20 AND AverageLeadTime < 16 ) Ejemplo 2: La siguiente consulta encuentra los nombres de todos los productos de subcategoria rueda (wheels) que Adventure Works hace. USE AdventureWorks2008R2; GO SELECT Name FROM Production.Product WHERE ProductSubcategoryID IN ( SELECT ProductSubcategoryID FROM Production.ProductSubcategory WHERE Name = 'Wheels' ) Ejemplo 3: La siguiente consulta encuentra los nombres de los productos que no han sean ningun tipo de bicicleta. USE AdventureWorks2008R2; GO SELECT Name FROM Production.Product WHERE ProductSubcategoryID NOT IN ( SELECT ProductSubcategoryID FROM Production.ProductSubcategory WHERE Name = 'Mountain Bikes' OR Name = 'Road Bikes' OR Name = 'Touring Bikes' )

Page 76: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 76

EXISTS

Especifica una subconsulta para probar la existencia de filas. Ejemplo 1: El siguiente ejemplo muestra dos consultas para buscar tiendas cuyo nombre es el mismo nombre que un vendedor. La primera consulta utiliza EXISTS y el segundo utiliza = ANY USE AdventureWorks2008R2 ; GO SELECT DISTINCT s.Name FROM Sales.Store AS s WHERE EXISTS ( SELECT * FROM Purchasing.Vendor AS v WHERE s.Name = v.Name ) ; GO Usando =ANY USE AdventureWorks2008R2 ; GO SELECT DISTINCT s.Name FROM Sales.Store AS s WHERE s.Name = ANY ( SELECT v.Name FROM Purchasing.Vendor AS v ) ; GO NOT EXISTS funciona al revés como el que existe. La cláusula WHERE de NOT EXISTS se cumple si no se devuelven filas de la subconsulta. El siguiente ejemplo busca los empleados que no están en los departamentos que tienen nombres que empiezan con P. SELECT p.FirstName, p.LastName, e.JobTitle FROM Person.Person AS p JOIN HumanResources.Employee AS e ON e.BusinessEntityID = p.BusinessEntityID WHERE NOT EXISTS (SELECT * FROM HumanResources.Department AS d JOIN HumanResources.EmployeeDepartmentHistory AS edh ON d.DepartmentID = edh.DepartmentID WHERE e.BusinessEntityID = edh.BusinessEntityID AND d.Name LIKE 'P%') ORDER BY LastName, FirstName GO

Page 77: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 77

Usando subconsultas con INSERT, DELETE, UPDATE

Subconsultas se pueden anidar en el UPDATE, DELETE, INSERT y SELECT (DML). Ejemplo 1: En el ejemplo siguiente se duplica el valor de la columna ListPrice en la tabla Production.Product. La subconsulta en la cláusula WHERE referencias de la tabla Purchasing.ProductVendor para restringir las filas actualiza en la tabla de productos que sólo los suministrados por VendorID 51

USE AdventureWorks2008R2; GO UPDATE Production.Product SET ListPrice = ListPrice * 2 WHERE ProductID IN ( SELECT ProductID FROM Purchasing.ProductVendor WHERE VendorID = 51 ); GO Aquí está una sentencia equivalente UPDATE, usando una combinación INNER JOIN. USE AdventureWorks2008R2; GO UPDATE Production.Product SET ListPrice = ListPrice * 2 FROM Production.Product AS p INNER JOIN Purchasing.ProductVendor AS pv ON p.ProductID = pv.ProductID AND pv.VendorID = 51; GO Ejemplo 2: La instrucción DELETE muestra la solución con subconsulta eliminando filas de la tabla SalesPersonQuotaHistory basándose en las ventas del año hasta la fecha almacenadas en la tabla SalesPerson. USE AdventureWorks2008R2; GO DELETE FROM Sales.SalesPersonQuotaHistory WHERE BusinessEntityID IN ( SELECT BusinessEntityID FROM Sales.SalesPerson WHERE SalesYTD > 2500000.00 ); GO

Page 78: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 78

Ejemplo 3: Usando subconsultas se inserta filas en la nueva tabla dbo.Moneda desde la tabla Sales.Currency. Use AdventureWorks --verifica si existe la tabla Moneda para borrarlo IF OBJECT_ID ('dbo.Moneda', 'U') IS NOT NULL DROP TABLE dbo.Moneda; GO --crea la tabla Moneda Create Table dbo.Moneda ( cod_moneda nchar(3), nom_moneda nvarchar(50) ) GO --Ingresa datos a la tbla moneda desde la tabla Sales.Currency INSERT dbo.Moneda SELECT CurrencyCode, Name FROM Sales.Currency ; GO

Page 79: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 79

Arreglos

Contenidos

- Lección 1: Consultas agrupadas - Lección 2: Funciones de grupo - Lección 3: Vistas

____________________________________________________________________________

Consultas agrupadas Se denomina así cuando se agrupa los datos de la tabla origen y produce una única fila resumen por cada grupo formado. Las columnas indicadas en el GROUP BY se llaman columnas de agrupación. Para cada registro, se crea un valor sumario si se incluye una función SQL agregada, como SUM, AVG, MAX, MIN o COUNT (como veremos después), en la instrucción SELECT.

Page 80: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 80

Cláusula GROUP BY La cláusula GROUP BY se usa para generar valores de agregado para cada fila del conjunto de resultados. Cuando se usan sin una cláusula GROUP BY, las funciones de agregado sólo devuelven un valor de agregado para una instrucción SELECT. Sintaxis:

SELECT campos_a_agrupar, Funciones_agregado() FROM tabla WHERE condición_campo GROUP BY campos_del_grupo HAVING condición_grupo

Ejemplo: En el ejemplo siguiente se calcula el total de cada pedido de ventas de la base de datos.

USE AdventureWorks; GO SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail sod GROUP BY SalesOrderID ORDER BY SalesOrderID ; GO

Cláusula HAVING Especifica una condición de búsqueda para un grupo o agregado. HAVING sólo se puede utilizar con la instrucción SELECT. Normalmente, HAVING se utiliza en una cláusula GROUP BY. Cuando no se utiliza GROUP BY, HAVING se comporta como una cláusula WHERE. Ejemplo: En el ejemplo siguiente, donde se utiliza una cláusula HAVING simple, se recupera el total de cada SalesOrderID de la tabla SalesOrderDetail que exceda $100000.00.

USE AdventureWorks2008R2 ; GO SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail GROUP BY SalesOrderID HAVING SUM(LineTotal) > 100000.00 ORDER BY SalesOrderID ;

Page 81: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 81

Funciones de Grupo

SUM() Devuelve la suma de todos los valores, o sólo los valores distintos, en la expresión. SUM se puede utilizar con columnas numéricas. Los valores nulos se omiten. Ejemplo 1:

USE AdventureWorks2008R2; GO SELECT Color, SUM(ListPrice), SUM(StandardCost) FROM Production.Product WHERE Color IS NOT NULL AND ListPrice != 0.00 AND Name LIKE 'Mountain%' GROUP BY Color ORDER BY Color; GO

Ejemplo 2:

USE AdventureWorks2008R2; GO SELECT Color, ListPrice, StandardCost FROM Production.Product WHERE Color IS NOT NULL AND ListPrice != 0.00 AND Name LIKE 'Mountain%' ORDER BY Color COMPUTE SUM(ListPrice), SUM(StandardCost) BY Color; GO

Ejemplo 3:

USE AdventureWorks2008R2; GO SELECT Color, SUM(ListPrice), SUM(StandardCost) FROM Production.Product GROUP BY Color ORDER BY Color; GO

Page 82: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 82

AVG() Devuelve el promedio de los valores de un grupo. Los valores nulos se omiten. Ejemplo 1: El siguiente ejemplo calcula el promedio de horas de vacaciones y la suma de las horas de licencia por enfermedad que los vicepresidentes de Adventure Works haya utilizado. Cada una de estas funciones de agregado produce un valor de resumen único para todas las filas recuperadas.

USE AdventureWorks2008R2; GO SELECT AVG(VacationHours)AS 'Average vacation hours', SUM (SickLeaveHours) AS 'Total sick leave hours' FROM HumanResources.Employee WHERE JobTitle LIKE 'Vice President%';

Ejemplo 2: Cuando se utiliza con una cláusula GROUP BY, cada función de agregado produce un solo valor para cada grupo, en lugar de para toda la tabla. En el ejemplo siguiente produce valores de resumen para cada territorio de ventas. El resumen muestra la bonificación media percibida por el personal de ventas en cada territorio y la suma de las ventas del año hasta la fecha de cada territorio. Su sintaxis es la siguiente:

USE AdventureWorks2008R2; GO SELECT TerritoryID, AVG(Bonus)as 'Promedio de Bonificación', SUM(SalesYTD) as „Ventas por año' FROM Sales.SalesPerson GROUP BY TerritoryID; GO

Ejemplo 3: La instrucción siguiente devuelve el precio de lista promedio de los productos.

USE AdventureWorks2008R2; GO SELECT AVG(DISTINCT ListPrice) FROM Production.Product;

Ejemplo 4: Sin DISTINCT, la función AVG comprueba el precio de lista promedio de todos los productos de la tabla Product.

USE AdventureWorks2008R2; GO SELECT AVG(ListPrice) FROM Production.Product;

Page 83: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 83

MAX() Devuelve el valor máximo en la expresión. Ejemplo 1: El ejemplo siguiente devuelve el más alto (máximo) de impuestos.

USE AdventureWorks2008R2; GO SELECT MAX(TaxRate) FROM Sales.SalesTaxRate; GO

Ejemplo 2: La siguiente consulta muestra el precio más alto de los productos por cada color, siempre y cuando el color no sea nulo y nombre del producto contenga la palabra MOUNTAIN.

USE AdventureWorks2008R2; GO SELECT Color, MAX(ListPrice) 'Precio mas aAto' FROM Production.Product WHERE Color IS NOT NULL AND Name LIKE 'Mountain%' GROUP BY Color

MIN().

Devuelve el valor mínimo de la expresión. Ejemplo 1: El ejemplo siguiente devuelve la más baja (mínima) tasa de impuestos.

USE AdventureWorks2008R2; GO SELECT MIN(TaxRate) FROM Sales.SalesTaxRate; GO

Ejemplo 2: El ejemplo visualiza los costos mínimos por cada color

SELECT Color, MIN(StandardCost) As [Costo Mínimo] FROM Production.Product GROUP BY Color

Page 84: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 84

COUNT(). Devuelve el número de elementos de un grupo. COUNT funciona como la función COUNT_BIG. La única diferencia entre las dos funciones es su valor de retorno. COUNT siempre devuelve un valor de tipo de datos int. COUNT_BIG siempre devuelve un valor de tipo de datos bigint. Ejemplo 1: El ejemplo siguiente muestra el número de títulos diferentes que un empleado que trabaja en Adventure Works puede contener.

USE AdventureWorks2008R2; GO SELECT COUNT(DISTINCT Title) FROM HumanResources.Employee; GO

Ejemplo 2: El siguiente ejemplo busca el número total de empleados que trabajan en Adventure Works.

USE AdventureWorks2008R2; GO SELECT COUNT(*) FROM HumanResources.Employee; GO

Ejemplo 3: El ejemplo muestra la cantidad de productos por cada color.

SELECT Color, COUNT(Name) As [Cantidad Productos] FROM Production.Product WHERE Color IS NOT NULL GROUP BY Color

Page 85: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 85

Vistas Una Vista es una tabla virtual cuyos contenidos (columnas y filas) se definen por una consulta. Utilice esta instrucción para crear una vista de los datos en una o varias tablas de la base de datos. Por ejemplo, una vista puede ser usado para los siguientes fines: • A fin de reforzar, simplificar y personalizar la percepción que cada usuario tiene de la base de datos. • Como un mecanismo de seguridad al permitir a los usuarios acceder a datos a través de la vista, sin conceder los permisos a los usuarios acceder directamente a las tablas base subyacentes. • Para proporcionar una interfaz compatible con versiones anteriores de emular una tabla cuyo esquema ha cambiado.

Creación de una Vista Para crear una vista se utiliza el comando CREATE VIEW. Sintaxis:

CREATE VIEW nombre_esquema.nombre_vista AS SELECT campos FROM tabla WHERE condicion GROUP BY campos_de_agrupamiento HAVING condición_de_grupo

Ejemplo 1: En el ejemplo siguiente se crea una vista utilizando una sentencia SELECT simple. A simple vista es útil cuando una combinación de columnas se consulta con frecuencia. Los datos de este punto de vista proviene de la HumanResources.Employee y las tablas de la base de datos Person.Person AdventureWorks2008R2.

USE AdventureWorks2008R2 ; GO IF OBJECT_ID ('hiredate_view', 'V') IS NOT NULL DROP VIEW hiredate_view ; GO CREATE VIEW hiredate_view AS SELECT p.FirstName, p.LastName, e.BusinessEntityID, e.HireDate FROM HumanResources.Employee e JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ; GO

Page 86: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 86

Ejemplo 2: En el ejemplo siguiente se utiliza la opción WITH ENCRYPTION y muestra las columnas calculadas, rebautizada como columnas, y en varias columnas.

USE AdventureWorks2008R2 ; GO IF OBJECT_ID ('Purchasing.PurchaseOrderReject', 'V') IS NOT NULL DROP VIEW Purchasing.PurchaseOrderReject ; GO CREATE VIEW Purchasing.PurchaseOrderReject WITH ENCRYPTION AS SELECT PurchaseOrderID, ReceivedQty, RejectedQty, RejectedQty / ReceivedQty AS RejectRatio, DueDate FROM Purchasing.PurchaseOrderDetail WHERE RejectedQty / ReceivedQty > 0 AND DueDate > CONVERT(DATETIME,'20010630',101) ; GO

Ejemplo 3: El siguiente ejemplo muestra una vista denominada SeattleOnly que hace referencia a cinco tablas y permite que las modificaciones de datos para aplicar únicamente a los empleados que viven en Seattle.

USE AdventureWorks2008R2 ; GO IF OBJECT_ID ('dbo.SeattleOnly', 'V') IS NOT NULL DROP VIEW dbo.SeattleOnly ; GO CREATE VIEW dbo.SeattleOnly AS SELECT p.LastName, p.FirstName, e.JobTitle, a.City, sp.StateProvinceCode FROM HumanResources.Employee e INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID INNER JOIN Person.BusinessEntityAddress bea ON bea.BusinessEntityID = e.BusinessEntityID INNER JOIN Person.Address a ON a.AddressID = bea.AddressID INNER JOIN Person.StateProvince sp ON sp.StateProvinceID = a.StateProvinceID WHERE a.City = 'Seattle' WITH CHECK OPTION ; GO

Page 87: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 87

Ejemplo 4: El siguiente ejemplo muestra una definición de la vista que incluye una función integrada. Al utilizar las funciones, debe especificar un nombre de columna para la columna derivada.

USE AdventureWorks2008R2 ; GO IF OBJECT_ID ('Sales.SalesPersonPerform', 'V') IS NOT NULL DROP VIEW Sales.SalesPersonPerform ; GO CREATE VIEW Sales.SalesPersonPerform AS SELECT TOP (100) SalesPersonID, SUM(TotalDue) AS TotalSales FROM Sales.SalesOrderHeader WHERE OrderDate > CONVERT(DATETIME,'20001231',101) GROUP BY SalesPersonID; GO

Modificación de una Vista

Para crear una vista se utiliza el comando ALTER VIEW. Sintaxis:

ALTER VIEW nombre_esquema.nombre_vista AS SELECT campos FROM tabla WHERE condicion GROUP BY campos_de_agrupamiento HAVING condición_de_grupo

Ejemplo: En el ejemplo siguiente se crea una vista que contiene todos los trabajadores y sus fechas de alquiler llamada EmployeeHireDate. Los permisos se conceden a la vista, pero los requisitos son cambiados para seleccionar los empleados cuyo alquiler fechas caen antes de una fecha determinada. Entonces, ALTER VIEW se utiliza para reemplazar la vista.

USE AdventureWorks2008R2 ; GO CREATE VIEW HumanResources.EmployeeHireDate AS SELECT p.FirstName, p.LastName, e.HireDate FROM HumanResources.Employee AS e JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ; GO

La vista debe ser cambiada para incluir sólo los empleados que fueron contratados antes de 1997. Si ALTER VIEW no se utiliza, pero en su lugar la vista se cae y vuelve a crear, el comando GRANT anteriores y cualquier otra declaración que tienen que ver con los permisos correspondientes a este punto de vista hay que volver a entrar.

ALTER VIEW HumanResources.EmployeeHireDate AS SELECT p.FirstName, p.LastName, e.HireDate FROM HumanResources.Employee AS e JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID WHERE HireDate < CONVERT(DATETIME,'19980101',101) ; GO

Page 88: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 88

Eliminar una vista

Para eliminar una vista se utiliza el comando DROP VIEW. Sintaxis:

DROP VIEW nombre_esquema.nombre_vista

Ejemplo: El siguiente ejemplo se quita la vista Reordenar.

USE AdventureWorks2008R2 ; GO IF OBJECT_ID ('dbo.Reorder', 'V') IS NOT NULL DROP VIEW dbo.Reorder ; GO

Page 89: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 89

Arreglos

Contenidos

- Lección 1: Integración de conocimiento. ____________________________________________________________________________

Consultas agrupadas Se denomina así cuando se agrupa los datos de la tabla origen y produce una única fila resumen por cada grupo formado. Las columnas indicadas en el GROUP BY se llaman columnas de agrupación.

Page 90: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 90

Arreglos

Contenidos

- Lección 1: Procedimiento almacenados ____________________________________________________________________________

Programación Transact SQL Transact/SQL permite agrupar una serie de instrucciones como lote, ya sea de forma interactiva o desde un archivo operativo. También, se puede utilizar estructuras de control de flujo por Transact/SQL para conectar las instrucciones utilizando estructuras de tipo de programación. Transact/SQL proporciona palabras clave especiales llamadas lenguaje de control de flujo que permiten controlar el flujo de ejecución de las instrucciones. El lenguaje de control de flujo se puede utilizar en instrucciones sencillas, lotes, procedimientos almacenados y disparadores.

Page 91: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 91

Procedimientos Almacenados

Los procedimientos almacenados son grupos formados por instrucciones SQL y el lenguaje de control de flujo. Cuando se ejecuta un procedimiento, se prepara un plan de ejecución para que la subsiguiente ejecución sea muy rápida. Los procedimientos almacenados pueden:

Incluir parámetros

Llamar a otros procedimientos

Devolver un valor de estado a un procedimiento de llamada o lote para indicar el éxito o el fracaso del mismo y la razón de dicho fallo.

Devolver valores de parámetros a un procedimiento de llamada o lote

Ejecutarse en SQL Server remotos La posibilidad de escribir procedimientos almacenados mejora notablemente la potencia, eficacia y flexibilidad de SQL. Los procedimientos compilados mejoran la ejecución de las instrucciones y lotes de SQL de forma dramática. Además los procedimientos almacenados pueden ejecutarse en otro SQL Server si el servidor del usuario y el remoto están configurados para permitir logins remotos. Los procedimientos almacenados se diferencian de las instrucciones SQL ordinarias y de lotes de instrucciones SQL en que están precompilados. La primera vez que se ejecuta un procedimiento, el procesador de consultas SQL Server lo analiza y prepara un plan de ejecución que se almacena en forma definitiva en una tabla de sistema, Posteriormente, el procedimiento se ejecuta según el plan almacenado. Puesto que ya se ha realizado la mayor parte del trabajo de procesamiento de consultas, los procedimientos almacenados se ejecutan casi de forma instantánea. Los procedimientos almacenados se crean con CREATE PROCEDURE. Para ejecutar un procedimiento almacenado, ya sea un procedimiento del sistema o uno definido por el usuario, use el comando EXECUTE. También, puede utilizar el nombre del procedimiento almacenado solo, siempre que sea la primera palabra de una instrucción o lote. En Microsoft SQL Server 2008, existen 02 tipos de procedimientos: Procedimiento almacenado del Sistema (SP) Los procedimientos almacenados del sistema, ya se encuentran definidos y cumplen un propósito específico. Los procedimientos almacenados del sistema se agrupan en las categorías que aparecen en la siguiente tabla.

Categoría Descripción

Procedimientos almacenados de

Active Directory

Se utilizan para registrar instancias de SQL Server y

bases de datos de SQL Server en Active Directory de

Microsoft Windows 2000.

Procedimientos almacenados del

catálogo

Se utilizan para implementar las funciones del

diccionario de datos ODBC y aislar las aplicaciones

ODBC de los cambios en las tablas subyacentes del

Page 92: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 92

sistema.

Procedimientos almacenados de

captura de datos modificados

Permiten habilitar, deshabilitar o informar sobre los

objetos de la captura de datos modificados.

Procedimientos almacenados de

cursor

Se utilizan para implementar la funcionalidad de

variable de cursor.

Procedimientos almacenados del

motor de base de datos

Se utilizan para el mantenimiento general del SQL

Server Database Engine (Motor de base de datos de

SQL Server).

Procedimientos almacenados de

Correo electrónico de base de

datos y SQL Mail

Se utilizan para realizar operaciones de correo

electrónico desde una instancia de SQL Server.

Procedimientos almacenados de

planes de mantenimiento de

bases de datos

Se utilizan para configurar las tareas de mantenimiento

fundamentales necesarias para administrar el

rendimiento de las bases de datos.

Procedimientos almacenados de

consultas distribuidas

Se utilizan para implementar y administrar consultas

distribuidas.

Procedimientos almacenados de

la búsqueda de texto completo

Se utilizan para implementar y consultar índices de

texto completo.

Procedimientos almacenados del

trasvase de registros

Se utilizan para establecer, modificar y supervisar las

configuraciones de trasvase de registros.

Procedimientos almacenados de

automatización

Permiten habilitar el uso de objetos de automatización

estándar en un lote estándar de Transact-SQL.

Procedimientos almacenados de

administración basada en

directivas

Se usan para la administración basada en directivas.

Procedimientos almacenados de

replicación

Se utilizan para administrar la replicación.

Procedimientos almacenados de

seguridad

Se utilizan para administrar la seguridad.

Procedimientos almacenados de

SQL Server Profiler

Lo utiliza SQL Server Profiler para supervisar el

rendimiento y la actividad.

Page 93: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 93

Procedimientos almacenados del

Agente SQL Server

Los utiliza el Agente SQL Server para administrar

actividades programadas y controladas por eventos.

Procedimientos almacenados de

XML

Se utilizan para la administración del texto XML.

Procedimientos almacenados

extendidos generales

Proporcionan una interfaz de una instancia de SQL

Server a los programas externos para diversas

actividades de mantenimiento.

SQL Server 2008 admite los siguientes procedimientos almacenados del sistema que se utilizan para realizar el mantenimiento general de una instancia de SQL Server.

sp_add_data_file_recover_suspect_db sp_dropmessage

sp_add_log_file_recover_suspect_db sp_droptype

sp_addextendedproc sp_executesql

sp_addextendedproperty sp_getapplock

sp_addmessage sp_getbindtoken

sp_addtype sp_help

sp_addumpdevice sp_helpconstraint

sp_altermessage sp_helpdb

sp_attach_db sp_helpdevice

sp_attach_single_file_db sp_helpextendedproc

sp_autostats sp_helpfile

sp_bindefault sp_helpfilegroup

sp_bindrule sp_helpindex

sp_bindsession sp_helplanguage

Page 94: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 94

sp_certify_removable sp_helpserver

sp_clean_db_file_free_space sp_helpsort

sp_clean_db_free_space sp_helpstats

sp_configure sp_helptext

sp_control_plan_guide sp_helptrigger

sp_create_plan_guide sp_indexoption

sp_create_plan_guide_from_handle sp_invalidate_textptr

sp_create_removable sp_lock

sp_createstats sp_monitor

sp_cycle_errorlog sp_procoption

sp_datatype_info sp_recompile

sp_dbcmptlevel sp_refreshview

sp_dbmmonitoraddmonitoring sp_releaseapplock

sp_dbmmonitorchangealert sp_rename

sp_dbmmonitorchangemonitoring sp_renamedb

sp_dbmmonitordropalert sp_resetstatus

sp_dbmmonitordropmonitoring sp_serveroption

sp_dbmmonitorhelpalert sp_setnetname

sp_dbmmonitorhelpmonitoring sp_settriggerorder

sp_dbmmonitorresults sp_spaceused

Page 95: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 95

sp_dboption sp_tableoption

sp_dbremove sp_unbindefault

sp_delete_backuphistory sp_unbindrule

sp_depends sp_updateextendedproperty

sp_detach_db sp_updatestats

sp_dropdevice sp_validname

sp_dropextendedproc sp_who

sp_dropextendedproperty

Procedimiento almacenado definido por el Usuario (USP) Son los que crea, define el usuario. Y como todo procedimiento, utiliza variables que son una entidad a la que se asigna un valor. Este valor puede cambiar durante el lote o el procedimiento almacenado donde se utiliza la variable. SQL Server tiene dos tipos de variables: locales y globales. Las variables locales están definidas por el usuario, mientras que las variables globales las suministra el sistema y están predefinidas.

Variables Globales: Las variables globales son variables predefinidas suministradas por el sistema. Se distinguen de las variables locales por tener dos símbolos “@”. Estas son algunas variables globales del servidor:

Variable Contenido

Contiene 0 si la última transacción se ejecutó de forma

correcta; en caso contrario, contiene el último número de

error generado por el sistema. La variable global @@error

se utiliza generalmente para verificar el estado de error de

un proceso ejecutado.

Contiene el último valor insertado en una columna

IDENTITY mediante una instrucción insert

@@Version @@Version

@@ServerName Devuelve el Nombre del Servidor

@@Language Devuelve el nombre del idioma en uso

@@error

@@identity

Page 96: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 96

Variables Globales: Las variables locales son variables definidas por el usuario. Los nombres de las variables Locales deben empezar con el símbolo “@”. A cada variable local, se le debe asignar un tipo de dato del sistema, exceptuando los tipos

TEXT, IMAGE o SYSNAME.

Las variables locales, se definen con la sentencia DECLARE, se asigna valor con la sentencia SET o SELECT, y se exhibe su valor con la sentencia PRINT o SELECT. Ejemplo:

USE AdventureWorks2008R2 ; GO -- Declaración DECLARE @nombre varchar(20) DECLARE @fechanac datetime DECLARE @sueldo numeric(8,2) -- Asignación SET @nombre='Javier' SET @fechanac='21/02/1980' SET @sueldo=1250.50 -- Impresión de valores PRINT @nombre PRINT @fechanac PRINT @sueldo

O

USE AdventureWorks2008R2 ; GO -- Declaración DECLARE @nombre varchar(20) DECLARE @fechanac datetime DECLARE @sueldo numeric(8,2) -- Asignación SELECT @nombre='Javier' SELECT @fechanac='21/02/1980' SELECT @sueldo=1250.50 -- Impresión de valores PRINT @nombre PRINT @fechanac PRINT @sueldo

Page 97: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 97

Las variables también puede asumir un valor resultado de una consulta.

USE AdventureWorks2008R2 ; GO -- Declaración DECLARE @nombre varchar(20) DECLARE @fechanac datetime DECLARE @sueldo numeric(8,2) -- Asignación SET @nombre= (SELECT TOP 1 FirstName + SPACE(1) + LastName FROM Person.Contact ) SET @fechanac=GETDATE() SET @sueldo=(SELECT MAX(Bonus) FROM Sales.SalesPerson ) -- Impresión de valores PRINT „Hola‟ + SPACE(1) + @nombre PRINT „Naciste en la fecha‟ + SPACE(1) + CAST(@fechanac AS varchar(25)) PRINT „Tu sueldo es‟ + SPACE(1) + CAST(@sueldo AS varchar(25))

Page 98: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 98

Control de flujo y palabras claves relacionadas.

Palabra Clave Función

IF Define una Ejecución condicional.

BEGIN Comienzo de un bloque de instrucciones

..END Final de un bloque de instrucciones

BREAK Sale del final del siguiente bucle mas exterior

.CONTINUE Reinicio del bucle while

DECLARE Declara variables locales

RETURN Sale de forma incondicional

CASE Permite que se muestre una valor alternativo

-- COMENTARIOInserta una línea de comentario en cualquier punto

de una instrucción SQL.

PRINTImprime un mensaje definido por el usuario o una

variable local en la pantalla del usuario

/* COMENTARIO */Inserta un comentario en cualquier punto de una

instrucción SQL

Control de Flujo y palabras claves Relacionadas

..ELSEDefine una ejecución alternativa cuando la condición

IF es falsa

WHILERepite la ejecución de instrucciones mientras la

condición es verdadera

Page 99: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 99

CREATE PROCEDURE.

Crea un procedimiento almacenado. Un procedimiento almacenado es una colección guardada de instrucciones Transact-SQL o una referencia a una aplicación Microsoft. NET Framework Common Language (CLR) método que puede tomar y devolver los parámetros proporcionados por el usuario. Los procedimientos se pueden crear para uso permanente o temporal para el uso dentro de un período de sesiones, procedimiento local temporal, o para el uso temporal en todas las sesiones, procedimiento temporal global. Los procedimientos almacenados también se pueden crear para ejecutarse automáticamente cuando una instancia de SQL Server se inicia. Sintaxis: CREATE PROCEDURE nombre_procedimiento Lista_de_parámetros AS Sentencias T-SQL GO Ejemplo 1: El siguiente procedimiento almacenado devuelve todos los empleados (nombres y apellidos incluidos), sus títulos profesionales, y sus nombres de departamentos desde una vista. Este procedimiento almacenado no utiliza ningún parámetro.

USE AdventureWorks2008R2; GO IF OBJECT_ID ( 'HumanResources.uspGetAllEmployees', 'P' ) IS NOT NULL DROP PROCEDURE HumanResources.uspGetAllEmployees; GO CREATE PROCEDURE HumanResources.uspGetAllEmployees AS SET NOCOUNT ON; SELECT LastName, FirstName, JobTitle, Department FROM HumanResources.vEmployeeDepartment; GO

Para ejecutar, se utiliza el comando EXECUTE (03 formas)

EXECUTE HumanResources.uspGetAllEmployees; GO -- O EXEC HumanResources.uspGetAllEmployees; GO -- O bien, si este procedimiento es la primera instrucción dentro del lote: HumanResources.uspGetAllEmployees;

Page 100: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 100

Ejemplo 2: El siguiente procedimiento almacenado devuelve sólo el empleado especificado (nombre y apellido suministrado), su título y su nombre de departamento de una vista. Este procedimiento almacenado acepta coincidencias exactas de los parámetros pasados.

USE AdventureWorks2008R2; GO IF OBJECT_ID ( 'HumanResources.uspGetEmployees', 'P' ) IS NOT NULL DROP PROCEDURE HumanResources.uspGetEmployees; GO CREATE PROCEDURE HumanResources.uspGetEmployees @LastName nvarchar(50), @FirstName nvarchar(50) AS SET NOCOUNT ON; SELECT FirstName, LastName, JobTitle, Department FROM HumanResources.vEmployeeDepartment WHERE FirstName = @FirstName AND LastName = @LastName; GO

El procedimiento almacenado uspGetEmployees se puede ejecutar en las siguientes maneras:

EXECUTE HumanResources.uspGetEmployees N'Ackerman', N'Pilar'; -- Or EXEC HumanResources.uspGetEmployees @LastName = N'Ackerman', @FirstName = N'Pilar'; GO -- Or EXECUTE HumanResources.uspGetEmployees @FirstName = N'Pilar', @LastName = N'Ackerman'; GO -- Or, if this procedure is the first statement within a batch: HumanResources.uspGetEmployees N'Ackerman', N'Pilar';

Ejemplo 3: El siguiente ejemplo muestra cómo puede crear un procedimiento almacenado que devuelve un conjunto de filas de todos los productos que tengan más de un día a la fabricación

CREATE PROC Production.LongLeadProducts AS SELECT Name, ProductNumber FROM Production.Product WHERE DaysToManufacture >= 1 GO

El procedimiento se ejecuta.

EXEC Production.LongLeadProducts

Page 101: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 101

ALTER PROCEDURE. Comando utilizado para modificar procedimientos. Sintaxis: ALTER PROCEDURE nombre_procedimiento Lista_de_parámetros AS Sentencias T-SQL_a_modificar GO Ejemplo: En el ejemplo siguiente se crea el procedimiento almacenado uspVendorAllInfo. Este procedimiento devuelve los nombres de todos los proveedores que suministran Adventure Works Cycles, los productos que suministran, sus calificaciones crediticias, y su disponibilidad. Después este procedimiento, se modifica para devolver un conjunto de resultados diferentes.

USE AdventureWorks2008R2; GO IF OBJECT_ID ( 'Purchasing.uspVendorAllInfo', 'P' ) IS NOT NULL DROP PROCEDURE Purchasing.uspVendorAllInfo; GO CREATE PROCEDURE Purchasing.uspVendorAllInfo WITH EXECUTE AS CALLER AS SET NOCOUNT ON; SELECT v.Name AS Vendor, p.Name AS 'Product name', v.CreditRating AS 'Rating', v.ActiveFlag AS Availability FROM Purchasing.Vendor v INNER JOIN Purchasing.ProductVendor pv ON v.BusinessEntityID = pv.BusinessEntityID INNER JOIN Production.Product p ON pv.ProductID = p.ProductID ORDER BY v.Name ASC; GO

Page 102: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 102

En el ejemplo siguiente cambia el procedimiento almacenado uspVendorAllInfo (sin la opción EXECUTE AS) para volver sólo a los proveedores que suministran el producto especificado. LEFT y las funciones CASE personalizan la apariencia del conjunto de resultados.

USE AdventureWorks2008R2; GO ALTER PROCEDURE Purchasing.uspVendorAllInfo @Product varchar(25) AS SELECT LEFT(v.Name, 25) AS Vendor, LEFT(p.Name, 25) AS 'Product name', 'Rating' = CASE v.CreditRating WHEN 1 THEN 'Superior' WHEN 2 THEN 'Excellent' WHEN 3 THEN 'Above average' WHEN 4 THEN 'Average' WHEN 5 THEN 'Below average' ELSE 'No rating' END , Availability = CASE v.ActiveFlag WHEN 1 THEN 'Yes' ELSE 'No' END FROM Purchasing.Vendor AS v INNER JOIN Purchasing.ProductVendor AS pv ON v.BusinessEntityID = pv.BusinessEntityID INNER JOIN Production.Product AS p ON pv.ProductID = p.ProductID WHERE p.Name LIKE @Product ORDER BY v.Name ASC; GO

Se ejecuta:

EXEC Purchasing.uspVendorAllInfo N'LL Crankarm'; GO

Page 103: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 103

DROP PROCEDURE. Comando utilizado para eliminar procedimientos. Sintaxis: DROP PROCEDURE nombre_procedimiento GO Ejemplo:

DROP PROCEDURE dbo.uspMyProc; GO

Page 104: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 104

Arreglos

Contenidos

- Lección 1: Concepto de Parámetros - Lección 2: Validando datos - Lección 3: Invocando otros procedimientos - Lección 4: Optimizando operaciones / Transacciones

____________________________________________________________________________

Parámetros Los parámetros son como variables, que se definen en un procedimiento o función y que permitirán recepcionar un valor para poderlo utilizar dentro de la estructura. También hay parámetros que devolverán un valor.

Page 105: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 105

Uso de Parámetros

Ejemplo 1:

USE AdventureWorks; GO CREATE PROCEDURE USP_EmployeeStatusMarital @año smallint AS SELECT * FROM HumanResources.Employee WHERE DATEPART (YY,BirthDate) = @año GO

Ejecutar

EXEC USP_EmployeeStatusMarital 1960

Ejemplo 2:

USE AdventureWorks; GO CREATE PROC USP_SalesMontoTotal @valor1 numeric(10,4), @valor2 numeric(10,4) AS SELECT * FROM Sales.SalesOrderHeader WHERE TotalDue BETWEEN @valor1 AND @valor2 GO

Ejecutar EXEC USP_SalesMontoTotal 9000,9250

Ejemplo 3:

USE AdventureWorks; GO CREATE PROCEDURE USP_Mensaje @cod_mensaje tinyint AS DECLARE @msg varchar(50) SET @msg = CASE @cod_mensaje WHEN 1 THEN 'Dato Incorrecto' WHEN 2 THEN 'Dato no Existe' WHEN 3 THEN 'Dato ya Existe' WHEN 4 THEN 'Dato es Nulo' ELSE 'Código de error no existe' END PRINT @msg GO

Ejecutar EXEC USP_Mensaje 2

Page 106: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 106

Validando datos / Invocando a otros procedimientos

Ejemplo 1: El procedimiento almacenado recibe como parámetro los campos de la tabla Sales.Currency, validando que los dato no sean nulos, y que el código no se repita, de ser así, mostrar un mensaje de error invocado desde otro procedimiento y abandonar el procedimiento. Si todo es correcto, ingresar los datos a la tabla.

USE AdventureWorks; GO CREATE PROCEDURE USP_IngresoCurrency @CurrencyCode nchar(3), @Name nvarchar(50), @ModifiedDate DateTime AS IF (@CurrencyCode IS NULL) OR (@Name IS NULL) OR (@ModifiedDate IS NULL) BEGIN EXEC USP_Mensaje 4 RETURN END IF EXISTS (SELECT * FROM Sales.Currency WHERE CurrencyCode = @CurrencyCode) BEGIN EXEC USP_Mensaje 3 RETURN END INSERT Sales.Currency VALUES (@CurrencyCode,@Name, @ModifiedDate) GO

Ejecutar:

EXEC USP_IngresoCurrency 'PPP','TangaMandaPio','12/10/09' Ejemplo 2: En el ejemplo siguiente se crea un procedimiento almacenado con parámetro de salida, que inserta un nuevo departamento en la tabla HumanResources.Department de la base de datos AdventureWorks.

CREATE PROC HumanResources.AddDepartment @Name nvarchar(50), @GroupName nvarchar(50), @DeptID smallint OUTPUT AS INSERT INTO HumanResources.Department (Name, GroupName) VALUES (@Name, @GroupName) SET @DeptID = SCOPE_IDENTITY()

Page 107: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 107

El @ DeptID es el parámetro de salida de la identidad del nuevo registro, la función SCOPE_IDENTITY muestra el valor generado automáticamente en el número de identificación. The following example shows how the calling application can store the results of the stored procedure execution using the local variable @dept.

DECLARE @dept int EXEC AddDepartment 'Refunds', '', @dept OUTPUT SELECT @dept

Page 108: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 108

Optimizando operaciones o transacciones Ejemplo 1: En el siguiente ejemplo se utiliza una instrucción UPDATE en un procedimiento almacenado. El procedimiento acepta un parámetro de entrada ,@NewHours. El valor del parámetro se utiliza en la instrucción UPDATE para actualizar la columna VacationHours de la tabla HumanResources.Employee. La expresión CASE se utiliza en la cláusula SET para determinar el valor que está establecido para VacationHours condicionalmente. Cuando se paga al empleado cada hora (SalariedFlag = 0), VacationHours se establece en el número actual de horas más el valor especificado en @NewHours; por otra parte, VacationHours se establece en el valor especificado en @NewHours.

USE AdventureWorks2008R2; GO CREATE PROCEDURE HumanResources.Update_VacationHours @NewHours smallint AS SET NOCOUNT ON; UPDATE HumanResources.Employee SET VacationHours = ( CASE WHEN SalariedFlag = 0 THEN VacationHours + @NewHours ELSE @NewHours END ) WHERE CurrentFlag = 1; GO

Ejecutar:

EXEC HumanResources.Update_VacationHours 40; Ejemplo 2: En el siguiente ejemplo, el procedimiento recibe un parámetro monto que deberá ser mayor a 0, de ser así, se elimina datos de la tabla Sales.SalesPersonQuotaHistory, siempre y cuando el campo SalesYTD es mayor al monto ingresado como parámetro

USE AdventureWorks2008R2; GO CREATE PROCEDURE USP_EliminarPersonQuotaHistory @monto numeric(10,2) AS IF @monto IS NULL OR @monto=0 BEGIN EXEC USP_Mensaje 2 RETURN END DELETE FROM Sales.SalesPersonQuotaHistory WHERE BusinessEntityID IN (SELECT BusinessEntityID FROM Sales.SalesPerson WHERE SalesYTD > @monto); GO

Ejecutar:

EXEC HumanResources.Update_VacationHours 40;

Page 109: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 109

Arreglos

Contenidos

- Lección 1: Funciones - Lección 2: Trigger

____________________________________________________________________________

Funciones Las funciones son rutinas formado por una o más instrucciones Transact-SQL que puede ser utilizada para encapsular el código para su reutilización. Una función toma cero o más parámetros de entrada y devuelve un valor escalar o una tabla. Los parámetros de entrada puede ser cualquier tipo de datos, excepto TimeStamp, Cursor, o tabla, las funciones no son compatibles con los parámetros de salida. Microsoft SQL Server 2008, dispone de 02 tipos de funciones: Funciones del Sistema de SQL Funciones Definidas por el Usuario. Estas funciones definidas por el usuario solucionarán los problemas de reutilización del código y dará mayor flexibilidad al programar las consultas de SQL. Estas funciones a su vez se clasifican en: Funciones Escalares Función de Tabla en Línea Función de Tabla de MultiSentencia.

Page 110: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 110

Funciones Escalares

Las funciones escalares devuelven un tipo de datos tales como int, money, varchar, float, etc. Pueden ser utilizadas en cualquier lugar incluso incorporado dentro de sentencias SQL. Sintaxis: CREATE FUNCTION nombre_función (lista de parámetros) RETURNS tipo_dato_a_devolver AS BEGIN Lógica_de_función --- ----- ------- ---- ------- ------ RETURN dato_a_devolver END Ejemplo 1: En el ejemplo siguiente se crea una función escalar que suma todas las ventas de una determinado producto en la base de datos AdventureWorks y devuelve el total como un int.

CREATE FUNCTION Sales.SumSold (@ProductID int) RETURNS int AS BEGIN DECLARE @ret int SELECT @ret = SUM(OrderQty) FROM Sales.SalesOrderDetail WHERE ProductID = @ProductID IF (@ret IS NULL) SET @ret = 0 RETURN @ret END

Una función definida por el usuario devuelve un valor escalar, se puede invocar en cualquier lugar que permita una expresión del mismo tipo de datos. Los siguientes tabla contiene ejemplos en los que se pueden utilizar funciones escalares.

Área Ejemplo

Consultas ■ Como una expresión en la select_list de una instrucción SELECT. ■ Como una expresión o Expresion_cadena en un caso o

La cláusula HAVING. ■ Como group_by_expression en una cláusula GROUP BY. ■ Como order_by_expression en una cláusula ORDER BY. ■ Como una expresión en la cláusula SET de una instrucción UPDATE. ■ Como una expresión en la cláusula VALUES de una instrucción

INSERTdeclaración.

Tabla definición ■ restricciones CHECK. Las funciones pueden referirse sólo a Columnas en la misma tabla.

■ DEFAULT definiciones. Funciones sólo puede contener constantes.

■ Columnas calculadas. Las funciones pueden referirse sólo a Columnas en la misma tabla.

Page 111: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 111

Área Ejemplo

Declaraciones ■ En los operadores de asignación. Transact-SQL ■ En las expresiones de Booleanas de las instrucciones de control de

flujo. ■ En las expresiones CASE.

■ En declaraciones IMPRIMIR (sólo para funciones que devuelven un cadena de caracteres).

Funciones y ■ Como argumentos de la función. Procedimientos ■ En la declaración de un procedimiento almacenado RETURN (sólo Almacenados para funciones escalar que devuelven un entero).

■ En la declaración de un procedimiento almacenado RETURN (sólo para funciones escalar que devuelven un entero).

El ejemplo siguiente realiza una instrucción SELECT que recupera el ProductID, el Nombre, y el resultado de la función SumSold escalar para cada registro de productos en AdventureWorks.

SELECT ProductID, Name, Sales.SumSold(ProductID) AS SumSold FROM Production.Product

Funciones de tabla en linea. Puede utilizar las funciones en línea para conseguir la funcionalidad de puntos de vista con parámetros. Uno de las limitaciones de una vista es que no se les permite incluir un parámetro proporcionado por el usuario.. Por lo general, puede resolver esto proporcionando una cláusula WHERE cuando se llama a la vista. Sin embargo, esto podría requerir la construcción de una cadena para una ejecución dinámica, que puede aumentar la complejidad de la solicitud. Puede alcanzar las funcionalidades de una vista con parámetros mediante el uso de una función en línea con valores de tabla. Considere las siguientes características en línea con valores de tabla de funciones definidas por el usuario. ■ La declaración RETURNS especifica la tabla como el tipo de datos devuelto. ■ El conjunto de resultados de la instrucción SELECT define el formato de una variable de retorno. ■ La cláusula RETURN contiene una sola instrucción SELECT en paréntesis. La instrucción SELECT utilizada en una función en línea está sujeta a las mismas restricciones que las instrucciones SELECT utilizada en las vistas. ■ El cuerpo de la función no tiene por qué ser encerrado en un bloque de BEGIN ... END. Ejemplo 1: En el ejemplo siguiente se crea una función con valores de tabla en línea que devuelve los nombres de empleados de un gerente en particular en la base de datos AdventureWorks.

Page 112: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 112

CREATE FUNCTION HumanResources.EmployeesForManager (@ManagerId int) RETURNS TABLE AS RETURN ( SELECT FirstName, LastName FROM HumanResources.Employee Employee INNER JOIN Person.Contact Contact ON Employee.ContactID = Contact.ContactID WHERE ManagerID = @ManagerId )

Invocando a la función:

SELECT * FROM HumanResources.EmployeesForManager(3) -- OR SELECT * FROM HumanResources.EmployeesForManager(6)

Ejemplo 2: El ejemplo siguiente devuelve una función en línea con valores de tabla. Devuelve tres columnas ProductID, Name y el agregado de los totales del año hasta la fecha por tienda como YTD Total, para cada producto vendido a la tienda.

USE AdventureWorks2008R2; GO IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL DROP FUNCTION Sales.ufn_SalesByStore; GO CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int) RETURNS TABLE AS RETURN (SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total' FROM Production.Product AS P JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID WHERE C.StoreID = @storeid GROUP BY P.ProductID, P.Name ); GO

Invocando a la función:

SELECT * FROM Sales.ufn_SalesByStore (602);

Page 113: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 113

Funciones de tabla Multisentencias.

Una función con valores de tabla de múltiple sentencia es una combinación de una vista y un procedimiento almacenado. Puede utilizar las funciones definidas por el usuario que devuelven una tabla para reemplazar procedimientos almacenados o vista. Una función con valores de tabla (como un procedimiento almacenado) puede utilizar una lógica compleja y múltiple Transact-SQL para crear una tabla. De la misma manera que utiliza una vista, puede utilizar una función con valores de tabla en la cláusula FROM de una instrucción de Transact-SQL. Considere las siguientes características de funciones de múltiples instrucciones con valores de tabla: ■ La sentencia RETURNS especifica la tabla como los tipos de datos devueltos y define un nombre para la tabla y el formato. ■ BEGIN ... END delimita el cuerpo de la función. Puede utilizar las funciones en línea para conseguir la funcionalidad de puntos de vista con parámetros. Uno de las limitaciones de una vista es que no se les permite incluir un Ejemplo : En el ejemplo siguiente se crea una tabla denominada variable @ tbl_Employees con dos columnas. Los cambios segunda columna en función del parámetro formato solicitado @ valor.

CREATE FUNCTION HumanResources.EmployeeNames (@format nvarchar(9)) RETURNS @tbl_Employees TABLE (EmployeeID int PRIMARY KEY, [Employee Name] nvarchar(100) ) AS BEGIN IF (@format = 'SHORTNAME') INSERT @tbl_Employees SELECT EmployeeID, LastName FROM HumanResources.vEmployee ELSE IF (@format = 'LONGNAME') INSERT @tbl_Employees SELECT EmployeeID, (FirstName + ' ' + LastName) FROM HumanResources.vEmployee RETURN END

Invocando a la función:

SELECT * FROM HumanResources.EmployeeNames('LONGNAME') -- OR SELECT * FROM HumanResources.EmployeeNames('SHORTNAME')

Page 114: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 114

Otro ejemplo :

USE AdventureWorks2008R2; GO IF OBJECT_ID (N'dbo.ufn_FindReports', N'TF') IS NOT NULL DROP FUNCTION dbo.ufn_FindReports; GO CREATE FUNCTION dbo.ufn_FindReports (@InEmpID INTEGER) RETURNS @retFindReports TABLE ( EmployeeID int primary key NOT NULL, FirstName nvarchar(255) NOT NULL, LastName nvarchar(255) NOT NULL, JobTitle nvarchar(50) NOT NULL, RecursionLevel int NOT NULL ) --Returns a result set that lists all the employees who report to the --specific employee directly or indirectly.*/ AS BEGIN WITH EMP_cte(EmployeeID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel) -- CTE name and columns AS ( SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, 0 -- Get the initial list of Employees for Manager n FROM HumanResources.Employee e INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = @InEmpID UNION ALL SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, RecursionLevel + 1 -- Join recursive member to anchor FROM HumanResources.Employee e INNER JOIN EMP_cte ON e.OrganizationNode.GetAncestor(1) = EMP_cte.OrganizationNode INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID ) -- copy the required columns to the result of the function INSERT @retFindReports SELECT EmployeeID, FirstName, LastName, JobTitle, RecursionLevel FROM EMP_cte RETURN END; GO

Invocando

SELECT * FROM HumanResources.EmployeeNames('LONGNAME') -- OR SELECT * FROM HumanResources.EmployeeNames('SHORTNAME')

Page 115: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 115

Trigger Un disparador es un tipo especial de procedimiento almacenado que se ejecuta cuando una instrucción INSERT, UPDATE, o DELETE manejan datos de una tabla especificada. Un disparador puede consultar otras tablas y pueden incluir instrucciones complejas Transact-SQL. A menudo se crean disparadores para exigir integridad referencial o coherencia entre los datos relacionados lógicamente en diferentes tablas. Se puede utilizar disparadores para hacer cumplir la lógica de negocio. Un disparador es un objeto de la base de datos. Cuando se crea un disparador, se especifica la tabla y los comandos de modificación de datos que deben “disparar” o activar el disparador. Luego, se indica la acción o acciones que debe llevar a cabo un disparador. Sintaxis 01: CREATE TRIGGER nombre_trigger ON nombre_tabla FOR operación AS ------ ……. GO Sintaxis 02: CREATE TRIGGER nombre_trigger ON nombre_tabla AFTER operación AS ------ ……. GO Sintaxis 03: CREATE TRIGGER nombre_trigger ON nombre_tabla INSTEAD OF operación AS ------ ……. GO

Page 116: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 116

Ejemplo 1 : El código siguiente muestra la creación de un disparador INSERT llamado insrtWorkOrder sobre la tabla Production.WorkOrder de la base de datos AdventureWorks. Observa el uso de la tabla insertada a trabajar con los valores que han causado la ejecución del Trigger.

CREATE TRIGGER [insrtWorkOrder] ON [Production].[WorkOrder] AFTER INSERT AS BEGIN SET NOCOUNT ON; INSERT INTO [Production].[TransactionHistory] ( [ProductID] ,[ReferenceOrderID] ,[TransactionType] ,[TransactionDate] ,[Quantity] ,[ActualCost] ) SELECT inserted.[ProductID] ,inserted.[WorkOrderID] ,'W' ,GETDATE(), inserted.[OrderQty] ,0 FROM inserted; END;

Ejemplo 2: El siguiente disparo DML imprime un mensaje en el cliente cuando alguien intenta agregar o cambiar los datos de la tabla de clientes.

USE AdventureWorks2008R2; GO IF OBJECT_ID ('Sales.reminder1', 'TR') IS NOT NULL DROP TRIGGER Sales.reminder1; GO CREATE TRIGGER reminder1 ON Sales.Customer AFTER INSERT, UPDATE AS RAISERROR ('Notify Customer Relations', 16, 10); GO

Page 117: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 117

Ejemplo 3: En el ejemplo siguiente se envía un mensaje de correo electrónico a un amigo específico (MaryM) cuando la tabla Customer tiene cambios, se ingresa datos o si se elimina algún registro.

USE AdventureWorks2008R2; GO IF OBJECT_ID ('Sales.reminder2','TR') IS NOT NULL DROP TRIGGER Sales.reminder2; GO CREATE TRIGGER reminder2 ON Sales.Customer AFTER INSERT, UPDATE, DELETE AS EXEC msdb.dbo.sp_send_dbmail @profile_name = 'AdventureWorks2008R2 Administrator', @recipients = '[email protected]', @body = 'Don''t forget to print a report for the sales force.', @subject = 'Reminder'; GO

Page 118: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 118

Ejemplo 4: En el ejemplo siguiente se crea un disparador para asegurarse de que la calificación crediticia para el vendedor es bueno cuando se realiza un intento para insertar una nueva orden de compra en la tabla PurchaseOrderHeader. Para obtener la calificación de crédito del Proveedor, deberá hacer referencia. Si la calificación de crédito del proveedor es muy bajo, se muestra un mensaje y la inserción no se ejecuta.

USE AdventureWorks2008R2; GO IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL DROP TRIGGER Purchasing.LowCredit; GO /* Este disparador evita una fila que sea insertados en la tabla Purchasing.PurchaseOrderHeader, Cuando la calificación de solvencia del proveedor (Vendor) especificado se establece en 5 (debajo de la media).*/ CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader AFTER INSERT AS DECLARE @creditrating tinyint, @vendorid int; IF EXISTS (SELECT * FROM Purchasing.PurchaseOrderHeader p JOIN inserted AS i ON p.PurchaseOrderID = i.PurchaseOrderID JOIN Purchasing.Vendor AS v ON v.BusinessEntityID = p.VendorID WHERE v.CreditRating = 5 ) BEGIN RAISERROR ('El proveedor no califica.', 16, 1); ROLLBACK TRANSACTION; RETURN END; GO

Page 119: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 119

Ejemplo 5: El código siguiente muestra la creación de un desencadenador INSTEAD OF sobre la tabla HumanResources.Employee de la base de datos AdventureWorks.

CREATE TRIGGER [delEmployee] ON [HumanResources].[Employee] INSTEAD OF DELETE NOT FOR REPLICATION AS BEGIN SET NOCOUNT ON; DECLARE @DeleteCount int; SELECT @DeleteCount = COUNT(*) FROM deleted; IF @DeleteCount > 0 BEGIN RAISERROR („Los empleados no pueden ser borrados..', 10,1); IF @@TRANCOUNT > 0 BEGIN ROLLBACK TRANSACTION; END END; END;

Page 120: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 120

Page 121: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 121

http://msftdbprodsamples.codeplex.com/releases/view/45907

Page 122: Manual Administracion de Bases de Datos I - V0810

Administración de Base de Datos I 122

¿Cuáles son los tipos de datos suministrados por el sistema?

http://msdn.microsoft.com/en-us/library/ms190014.aspx