Sie sind auf Seite 1von 122

Presentacin..

Modulo A
Semana 1: Creacin de Base de Datos y Archivos de datos....4

Semana 2: Creacin de Tipos de Datos y Tablas ..............28 Semana 3: Creacin de ndices e Implementacin de consultas.......38 Semana 4: Consultas Multitablas Subconsultas...............65 Semana 5: Consultas Agrupadas Funciones de Grupo - Vistas......74 Semana 6: Revisin de conocimientos......92 Semana 7: Procedimientos Almacenados I 109 Semana 8: Procedimientos Almacenados II .115 Semana 9: Funciones definidas por el usuario Trigger121

Bibliografa:

Administracin de Base de Datos I

PRESENTACIN
Esta gua didctica es un material de ayuda institucional, perteneciente a las especialidades de computacin, Ingeniera de Software e Ingeniera de Redes y Comunicaciones tiene por finalidad proporcionar los conocimientos de la implementacin y administracin de Base de Datos en su primera parte. La Organizacin SISE, lder en la enseanza tecnolgica a nivel superior, promueve la elaboracin de materiales educativos, en concordancia a las exigencias de las tecnologas de estos tiempos, que permiten la creacin de nuevas herramientas de aprendizaje con el objetivo de facilitar el acceso de los estudiantes a la educacin en el marco del desarrollo tecnolgico de la informtica de las telecomunicaciones. Esta gua contiene conceptos relacionados con la planificacin en la creacin 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. Tambin contiene informacin 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 implementacin de una Base de datos, permitirn que el alumno aplique todos los conceptos. Este material en su primera edicin, servir para ayudar a nuestros estudiantes SISESINOS.

Administracin de Base de Datos I

Arreglos

Contenidos
- Leccin 1: Crear Databases - Leccin 2: Crear Filegroups - Leccin 3: Crear Schemas ____________________________________________________________________________

Despus de completar esta semana, los alumnos sern capaces de: Crear bases de datos. Crear grupos de archivos. Crear esquemas. Introduccin Una de las tareas ms fundamentales que un desarrollador de bases de datos debe realizar es la creacin de una base de datos y sus componentes principales, tales como grupos de archivos y esquemas. En esta semana, usted aprender cmo crear bases de datos, grupos de archivos, esquemas.

Administracin de Base de Datos I

BASE DE DATOS
Una Base de Datos es un contenedor de Objetos, estos objetos puede ser: Orgenes 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 estarn 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.

Administracin de Base de Datos I

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 acrnimo (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 definicin de datos) DML (Data Manipulation Language Lenguaje de manipulacin de datos) DCL (Data Control Language Lenguaje de control de Datos)

DDL
CREATE ALTER DROP

DML
INSERT DELETE UPDATE SELECT

DCL
Para controlar, gestionar, asegurar informacin
GRANT REVOKE BACKUP RESTORE

Para crear Base de datos y Para manipulacin de datos, sus objetos transacciones

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

Administracin de Base de Datos I

Creacin 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 Descripcin Registra toda la informacin del sistema para una instancia de SQL Server. La utiliza el Agente SQL Server para programar alertas y trabajos. 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 tamao de la base de datos, la intercalacin, el modelo de recuperacin y otras opciones de base de datos, se aplicarn a las bases de datos que se creen con posterioridad. rea de trabajo que contiene objetos temporales o conjuntos de resultados intermedios.

master msdb

model

tempdb

. 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 tecnologas que se rene el almacenamiento de datos requisitos de procesamiento de transacciones online (OLTP) y el procesamiento analtico en lnea (OLAP) entornos.

Administracin de Base de Datos I

SQL Server es un sistema de base de datos relacional de gestin de (RDBMS) que: Administra el almacenamiento de datos para las transacciones y el anlisis. Almacena los datos en una amplia gama de tipos de datos, incluyendo texto, numrico, extensible Markup Language (XML), y objetos de gran tamao. Responde a las peticiones de aplicaciones cliente. Utilizacin de Transact-SQL, XML, SQL Server u otros comandos para enviar solicitudes entre una aplicacin 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 recuperacin de todos los datos a un punto de coherencia conocido, en el caso de un sistema fallo. Bases de datos OLTP Su funcin es organizar los datos en tablas relacionales de una base de datos OLTP, reducir la informacin redundante y aumentar la velocidad de las actualizaciones. SQL Server permite a un gran nmero de usuarios realizar transacciones y al mismo tiempo cambiar los datos en tiempo real en bases de datos OLTP. Bases de datos OLAP Tecnologa OLAP se utiliza para organizar y resumir grandes cantidades de datos para que un analista pueda evaluar los datos de forma rpida y en tiempo real. Microsoft Analysis Server SQL Services organiza estos datos para apoyar una amplia gama de soluciones empresariales, desde presentacin de informes empresariales y anlisis 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 fsica 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 extensin de nombre de archivo recomendado para los archivos de datos primarios es .mdf. 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 extensin de nombre de archivo recomendado para archivos de datos secundarios es .ndf.

LogFile (Archivo de registro de transacciones).- Archivos de registro mantienen toda la informacin 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 ms de uno. La extensin de nombre de archivo recomendado para archivos de registro es .ldf.

Administracin de Base de Datos I

BASE DE DATOS

DATAFILE

LOGFILE

PRIMARY DATAFILE

SECONDARY DATAFILE

LOGFILE

(.mdf)

(.ndf)

(.ldf)

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 propsito de almacenamiento de datos OLTP y bases de datos OLAP son diferentes y, por lo tanto, los requisitos de diseo diferentes. Rendimiento de transacciones. Las Bases de datos OLTP a menudo tienen un alto requerimiento para el nmero de transacciones que pueden ser procesados por minuto, hora o da. Un diseo eficiente con un nivel apropiado de normalizacin, ndices y datos particiones pueden lograr un nivel muy alto de rendimiento de transacciones. El potencial de crecimiento de almacenamiento de datos fsica. Grandes cantidades de datos requieren hardware adecuado para la memoria, espacio en disco duro y unidad central de procesamiento (CPU) de potencia. Estimacin de la cantidad de datos que almacenar la base de datos sobre meses y aos 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 automticamente hasta un tamao mximo especificado. Sin embargo, el crecimiento automtico de archivos puede afectar al rendimiento.

Administracin de Base de Datos I

En la mayora de soluciones de bases de datos basadas en servidor, debe crear la base de datos con archivos de tamao adecuado, vigilar el uso del espacio, y reasignar ms espacio slo cuando sea necesario. Ubicacin del archivo. Dnde 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 travs de ms de un disco. Esto permite a SQL Server tener ventaja de las conexiones mltiples y mltiples discos cabezas de lectura y escritura de datos eficaz. Ejemplo de la creacin 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 cmo 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

Administracin de Base de Datos I

10

Transaction Una transaccin es una sola unidad de trabajo en una base de datos. El acrnimo ACID es de uso frecuente para describir las caractersticas de una transaccin. ACID significa: Atomicidad. Una transaccin es una unidad atmica, bien de todas las operaciones definidas en las transacciones se han completado, o ninguno de ellos se completan. Coherencia. Una transaccin siempre deja los datos en un estado coherente. Aislamiento (Isolation). Una transaccin opera al margen de la actividad de otra base de datos; otra actividad de base de datos concurrentes no tiene ningn efecto sobre la transaccin. Durabilidad. Cuando una transaccin se confirma, los resultados se almacenan en dispositivos de almacenamiento persistentes y sobrevivir al fallo del sistema. SQL Server es compatible con transacciones implcitas para las intervenciones individuales que modifican datos y las transacciones explcitas para mltiples sentencias que deben ejecutarse como una unidad. Transaction log SQL Server, registra todas las transacciones en un fichero de transaccin de registro para mantener base de datos coherente y para ayudar en la recuperacin de un fallo de base de datos. El registro (LOG) es un rea de almacenamiento que automticamente rastrea los cambios en una base de datos. SQL Server graba en el disco las modificaciones, en el LOG estn las modificaciones que se realizan antes de escribirlos en la base de datos. Logging process El proceso de registro es el siguiente: 1. La aplicacin enva una modificacin de datos. 2. Cuando una modificacin es ejecutada, las pginas de datos afectados se cargan desde el disco en la cach del bfer, a condicin de que las pginas no se encuentran ya en la cach del bfer de una consulta anterior. 3. El LOG registra cada instruccin de modificacin de datos como la modificacin 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 recuperacin automtico utiliza el registro de transacciones (LOG) a ejecutar todas las transacciones confirmadas y hacer retroceder (RollBack) cualquier transaccin incompleta. El registro utiliza marcadores de transaccin durante la recuperacin automtica para determinar el inicio y los puntos de finalizacin de una transaccin. Una transaccin se considera completa cuando el marcador BEGIN TRANSACTION tiene un marcador asociado COMMIT TRANSACTION, las pginas de datos se escriben en el disco cuando se produce un CheckPoint.

Administracin de Base de Datos I

11

Prctica: Creacin de bases de datos


Objetivos El objetivo de esta prctica es para que usted pueda crear una base de datos con SQL Server Management Studio y mediante el uso de Transact-SQL. En esta prctica, se utiliza tanto tcnicas para crear una nueva base de datos. Preparacin Asegrese de que la mquina virtual se est ejecutando Si una mquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras mquinas virtuales. 2. Inicie la mquina virtual. Para crear una base de datos utilizando SQL Server Management Studio En el explorador de objetos de Microsoft SQL 2008, sealar el contenedor BASE DE DATOS, hacer click en el botn secundario, luego elegir la opcin NUEVA BASE DE DATOS, aparecer la ventana para definir el nombre y propiedades de la Base de Datos a crear.

Administracin de Base de Datos I

12

En el cuadro de dilogo Nueva base de datos, introducir los datos en la tabla siguiente. Propiedad Nombre de Base de datos Tamao inicial de testdb Valor testdb 20

1. En la columna de Crecimiento automtico de la entrada testdb, haga clic en el botn de puntos suspensivos (...). 2. En el cuadro de Crecimiento automtico, en el cuadro de dilogo para testdb, desactive la opcin Habilitar Crecimiento automtico en la casilla de verificacin y, a continuacin, haga clic en Aceptar. 3. Cambiar el tamao inicial de configuracin de la entrada TestDB_log a 5 MB. 4. En la columna de Crecimiento automtico de la entrada TestDB_log, haga clic en el botn de puntos suspensivos (...). 5. En el Crecimiento automtico en el cuadro de dilogo para TestDB_log, desactive la opcin Habilitar Crecimiento automtico en el cuadro de verificacin y haga clic en Aceptar. 6. En el cuadro de dilogo 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.

Administracin de Base de Datos I

13

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 botn Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente cdigo de Transact-SQL (el parmetro filename debe ser escrita en una sola lnea). 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 botn 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. Creacin 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 explcitamente en el parmetro de tamao.

Administracin de Base de Datos I

14

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 especificacin de archivos de datos mltiples 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

Administracin de Base de Datos I

15

Creando FILEGROUPS
SQL Server 2008 almacena los datos en archivos de datos que luego pueden ser agrupados en uno o ms 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 podra ser ventajoso crear grupos de archivos mltiples. En esta parte, usted aprender acerca de grupos de archivos y cmo se puede mejorar el funcionamiento de una base de datos. Tambin aprenders cmo crear grupos de archivos. Qu es un FILEGROUP?

Un grupo de archivos es una coleccin lgica 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 ubicacin fsica de objetos individuales en la base de datos puede proporcionar un nmero de gestin y ventajas de rendimiento. Por ejemplo, puede utilizar grupos de archivos mltiples para controlar la forma en que el datos en una base de datos se almacena fsicamente en dispositivos de almacenamiento y de separar de lectura / escritura de datos a partir de datos de slo lectura. Tipos de FileGroups SQL Server 2005 tiene un grupo de archivos principal y tambin 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 extensin mdf. Un grupo de archivos definido por el usuario se compone de archivos de datos que se agrupan para asignacin y fines administrativos. Estos archivos de datos se conocen como archivos de datos secundarios y por lo general utilizan la extensin de la NDF.

Administracin de Base de Datos I

16

Ejemplo de escenarios para mltiples grupos de archivos La ilustracin es un ejemplo de cmo 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 ilustracin, 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 informacin actualizada de la orden actual. Tambin 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 cdigo Transact-SQL, se utiliza la instruccin 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')

Tambin puede utilizar la instruccin ALTER DATABASE para aadir o eliminar archivos y grupos de archivos en bases de datos existentes. Cundo 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 ubicacin fsica de los datos.

Administracin de Base de Datos I

17

Uso de archivos mltiples 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 aplicacin de una forma de creacin 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 travs de la particiones de disco fsico. Este enfoque permite un control ms preciso a los datos de creacin 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 mltiples para controlar la ubicacin de los datos fsicos Para utilizar grupos de archivos para facilitar el mantenimiento o alcanzar objetivos de diseo, 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 restauracin 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 restauracin efectiva.

Administracin de Base de Datos I

18

Prctica: Creacin de grupos de archivos


Objetivo El objetivo de esta prctica es que le permiten crear grupos de archivos el uso de TransactSQL. Preparacin Asegrese de que la mquina virtual se est ejecutando Si una mquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras mquinas virtuales. 2. Inicie la mquina 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 TransactSQL: 1. En SQL Server Management Studio, haga clic en el botn Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente cdigo 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 botn Ejecutar en la barra de herramientas. 4. Compruebe seleccionando la Base de Datos TransactTestDB, click en botn secundario (botn derecho) y propiedades. Aqu podr visualizar los grupos de archivos y cual es el que se encuentra activo o por default.

Administracin de Base de Datos I

19

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 leccin, obtendr informacin acerca de los esquemas de trabajo y cmo ayudan a desarrollar estructuras de base de datos que son fciles de manejar. Tambin 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 planificacin y la aplicacin 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 lmite 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 ilustracin 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.

Administracin de Base de Datos I

20

En SQL Server 2008, los esquemas proporciona los siguientes beneficios: Una mayor flexibilidad en la organizacin de los objetos de base de datos en espacios de nombres, ya que el agrupacin de objetos en los esquemas no depende de la propiedad de objeto. Simplificacin de la gestin de permisos, porque el permiso se puede conceder en el esquema de alcance, as como en los objetos individuales. Mejor capacidad de administracin, 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) Produccin (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 explcita 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

Administracin de Base de Datos I

21

Cmo funciona la Resolucin Nombre del Objeto?

Cuando una base de datos contiene varios esquemas, el objeto puede convertirse en la resolucin 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 inequvocos: 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 instruccin 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 ningn esquema predeterminado definido ejecuta la misma instruccin, 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 clusula de la DEFAULT_SCHEMA o CREATE USER o ALTER USER.

Administracin de Base de Datos I

22

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

Prctica: Creacin de SCHEMA


Objetivo El objetivo de esta prctica es crear esquemas mediante el uso de Transact-SQL. En esta prctica, se utiliza tcnicas para crear un nuevo esquema. Preparacin Asegrese de que la mquina virtual se est ejecutando Si una mquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras mquinas virtuales. 2. Inicie la mquina 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 botn Nueva consulta en la barra de herramientas. 2. En la nueva ventana, escriba el siguiente cdigo de Transact-SQL. Use TransactTestDB GO CREATE SCHEMA [Marketing] GO 3. Haga clic en el botn 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.

Administracin de Base de Datos I

23

Arreglos

Contenidos
- Leccin 1: Crear Tipo de Dato - Leccin 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 informacin (caracteres, nmeros o fechas) que una columna o campo puede contener, y la forma de cmo se almacenan los datos. SQL Server 2005 provee ms de 30 tipos de datos del sistema especficos. SQL Server 2005 tambin es compatible con tipos de datos de alias, que son definidos por el usuario y que estn basados en los tipos de datos del sistema.

Administracin de Base de Datos I

24

Cules 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 nmero de tipos de datos. Algunas categoras de tipos de datos que son de uso comn en varios lenguajes de programacin y tienen asociados los tipos de datos de SQL Server. Usted debe utilizar el tipo de datos ms pequeo 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 sinnimos de datos estndar tipos usados el American National Standards Institute (ANSI) en sistemas de bases de datos ANSI.

Administracin de Base de Datos I

25

Tipos de datos comunes Entero

Numrico Exacto Numrico Aproximado

Tipos de datos del sistema de SQL Server Int bigint smallint, tinyint decimal[(p[,s])] numeric[(p[,s])] float[(n)] real money, smallmoney datetime, smalldatetime date time datetime2 char[(n)] varchar[(n)]

Sinmino ANSI

Nmero de Bytes Integer 8 2,1 2 -17 8 4 8,4 8 4 4 4 8 0-8000

Integer

Dec double precisin, float[(n)] para n=8-15 float[(n)] para n=1-7 -

Moneda

Fecha y hora

Carcter text nchar[(n)] nvarchar[(n)] ntext binary [(n)] varbinary [(n)] Image xml

character [(n)] char VARYING[(n)] character VARYING[(n)] -

Caracteres Unicote

0-2 GB 0-8000 (4000 caracteres) 0-2 GB 0-8000

Binario Imagen XML

binary VARYING[(n)] -

0 a 2 GB 02 GB

Administracin de Base de Datos I

26

Cules 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 an ms 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 especfica. Debe tener un nombre nico dentro de la base de datos. (Pero alias de tipos de datos con diferentes nombres pueden tener la misma definicin.) Debe crear un tipo de datos definido por el usuario o alias para definir un conjunto de datos de uso comn con un formato especfico. Por ejemplo, una columna en la que almacenar un cdigo de pas basado en la Organizacin Internacional de Normalizacin (ISO) alfa-2 internacional para la abreviatura de nombre del pas (como JP para Japn y para la CH Suiza) podra ser definido como char(2). Sin embargo, si el cdigo del pas se utilizar regularmente a lo largo de la base de datos, se podra definir un tipo de datos countryCode y se utilizara en su lugar. Esto hace ms fcil de entender las definiciones de objetos en su base de datos. Ejemplo de la creacin de un tipo de datos de alias El siguiente cdigo ejemplo muestra cmo crear un tipo de datos alias llamado countryCode.

CREATE TYPE dbo.CountryCode FROM char(2) NULL

Administracin de Base de Datos I

27

Prctica: Creacin de tipos de datos


Objetivo El objetivo de esta prctica 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 instruccin CREATE TYPE de Transact-SQL. En esta prctica, se utiliza tanto tcnicas para crear tipos de alias en la base de datos AdventureWorks. Preparacin Asegrese de que la mquina virtual se est ejecutando Si una mquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras mquinas virtuales. 2. Inicie la mquina 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 botn Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente cdigo de Transact-SQL. USE AdventureWorks CREATE TYPE dbo.EmailAddress FROM nvarchar(50) NULL 3. Haga clic en el botn 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 aadido a la base de datos.

Administracin de Base de Datos I

28

Creacin de tablas
Despus 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 cmo SQL Server fsicamente organiza los datos y cmo 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 especfica. 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: Ms 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 mxima aproximada no se aplica a imagen, texto y tipos de datos ntext o columnas definidas mediante con el mximo especificado.)

Administracin de Base de Datos I

29

Ejemplo de la creacin de una tabla Puede crear tablas utilizando Explorador de objetos en SQL Server Management Studio o utilizando la instruccin CREATE TABLE de Transact-SQL. El siguiente cdigo 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 definicin de tabla en Explorador de objetos o mediante el ALTER TABLE Transact-SQL. Por ejemplo, las siguientes sentencias Transact-SQL, muestra cmo agregar una columna y cambiar la aceptacin 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

Administracin de Base de Datos I

30

Prctica: Creacin de tablas


Objetivo El objetivo de esta prctica 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 prctica, utilizar tcnicas para crear tablas en la base de datos AdventureWorks. Preparacin Asegrese de que la mquina virtual se est ejecutando Si una mquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras mquinas virtuales. 2. Inicie la mquina 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 botn Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente cdigo 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 botn 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 aadido 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 restriccin PRIMARY KEY. CREATE TABLE MyCustomers2 (CustID int CONSTRAINT pkCustId PRIMARY KEY ) Go

Administracin de Base de Datos I

31

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

Administracin de Base de Datos I

32

Descripcin 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 desempear un papel importante en el xito o el fracaso de una organizacin o empresa comercial. Garantizar la integridad de los datos es un paso crtico en el mantenimiento de datos de alta calidad. Usted debe hacer cumplir la integridad de datos en todos los niveles de una aplicacin desde la primera entrada hasta su almacenamiento. Microsoft SQL Server 2008 ofrece una variedad de caractersticas que simplifican la aplicacin de la integridad de los datos. Esta leccin comienza con una descripcin de los tipos de integridad de los datos que le conciernen como desarrollador de base de datos y un resumen de las caractersticas proporcionadas por SQL Server 2008 para satisfacer tales exigencias. A continuacin, se examinan en detalle tres de los ms ricas y poderosas caractersticas de integridad de datos de SQL Server 2008: restricciones, desencadenadores y esquemas XML. Un paso importante en la planificacin 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 leccin, obtendr informacin 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

Administracin de Base de Datos I

33

La ejecucin 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 vlidos 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 accin en cascada est permitido. Se puede definir relaciones de integridad referencial dentro de la misma tabla o entre tablas separadas. Implementando Constraints.Despus de completar esta leccin, los estudiantes sern 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.

Administracin de Base de Datos I

34

Cules son las Restricciones?

Tipo de Integridad
Dominio

Tipo de Restriccin
DEFAULT

Destino
Columna

Descripcin
Especifica el valor predeterminado para la columna cuando en una instruccin INSERT no se proporciona un valor. La restriccin DEFAULT es la alternativa recomendada a un objeto predeterminado. Especifica los datos o los valores que son aceptables en una columna. La restriccin 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. Identifica cada fila de manera nica, asegura que los usuarios no ingresen valores duplicados y tambin se crea un ndice para mejorar el rendimiento. Los valores nulos no estn permitidos. Evita la duplicacin de la variante (no principal) llaves y se crea un ndice para mejorar el rendimiento. se permiten valores Define una columna o combinacin 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.

CHECK

Columna

FOREIGN KEY

Tabla

NULL Entidad PRIMARY KEY

Columna Tabla

UNIQUE

Column

Referencial

FOREIGN KEY

Tabla

CHECK

Columna

Administracin de Base de Datos I

35

Creando Constraint (Restricciones) Se crea restricciones al crear una tabla mediante la instruccin CREATE TABLE. Una restriccin de nivel de columna se aplica a una sola columna y es parte de la columna definicin. Una restriccin de nivel de tabla puede hacer referencia a uno o ms columnas de la tabla. Puede modificar las restricciones en una tabla existente mediante la instruccin ALTER TABLE. Restriccin Primary Key Una restriccin PRIMARY KEY define una o ms 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 cdigo siguiente se muestra la instruccin 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 restriccin PRIMARY KEY: Una tabla slo puede tener una restriccin PRIMARY KEY. Las columnas incluidas en la restriccin PRIMARY KEY no puede aceptar valores nulos. Los valores en las columnas especificadas en la clave principal debe ser nico. Si el Restriccin PRIMARY KEY contiene ms de una columna, duplicados pueden aparecer en una columna, pero la combinacin de los valores de todas las columnas de la PRIMARIA definicin restriccin de clave debe ser nico. Una restriccin 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. (Clster es el valor predeterminado si el ndice no existe.) No se puede cada del ndice que apoya la restriccin PRIMARY KEY. Slo cuando se eliminar la restriccin PRIMARY KEY es el ndice eliminado. Este ndice tambin permite un acceso rpido 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] )

Administracin de Base de Datos I

36

Restricciones DEFAULT Una restriccin DEFAULT introduce un valor en una columna cuando no se especifica en un valor. Considere los siguientes datos antes de implementar una restriccin DEFAULT: Una restriccin DEFAULT slo se aplica a las instrucciones INSERT. Cada columna puede tener slo una restriccin DEFAULT. Las columnas con la propiedad de identidad o el tipo de datos RowVersion no puede tener una restriccin 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 restriccin 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 restriccin CHECK: Una restriccin CHECK verifica los datos cada vez que se ejecuta una instruccin INSERT o UPDATE. Una restriccin CHECK puede ser cualquier expresin lgica (booleana) que devuelve TRUE o FALSO. Una restriccin CHECK no puede contener subconsultas. Una sola columna puede tener varias restricciones CHECK. Una restriccin 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 declaracin devolver las filas que contienen datos que infringe una restriccin CHECK. Crea restricciones CHECK utilizando la columna o la clusula CONSTRAINT de nivel de tabla de las declaraciones CREATE TABLE y ALTER TABLE. El cdigo siguiente se muestra la instruccin de Transact-SQL utilizada para agregar una restriccin 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))

Administracin de Base de Datos I

37

Restricciones UNIQUE Una restriccin UNIQUE especifica que dos filas de una columna no puede tener el mismo valor. Una restriccin UNIQUE es til cuando usted ya tiene una clave principal, como un nmero de empleado, pero quiere garantizar que los identificadores, tales como un nmero de empleado fiscal, tambin son nicos. Considere los siguientes datos antes de implementar una restriccin UNIQUE: Slo un valor nulo puede aparecer en una columna con una restriccin UNIQUE. Una tabla puede tener varias restricciones UNIQUE, mientras que slo puede tener una sola clave principal. Una restriccin UNIQUE es forzada a travs de la creacin de un ndice nico sobre la la columna o columnas especificadas. Este ndice no se puede permitir que la tabla superior a los 249 lmite de los ndices no agrupados. El motor de base de datos devolver un error si se crea una restriccin UNIQUE en una columna que contiene los datos en los que se encuentran los valores duplicados. Considere el uso de una restriccin 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 lgica 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 nmeros de impuestos o el nmero de pasaporte. Considere el uso de una restriccin 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 lgica 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 nmeros de impuestos o el nmero de pasaporte. Puede crear restricciones UNIQUE mediante el uso de la clusula UNIQUE nivel de columna de la CREATE TABLE y ALTER TABLE. El cdigo 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,
)

Administracin de Base de Datos I

38

Restricciones FOREIGN KEY Una clave externa es una columna o combinacin de columnas que se utiliza para establecer y hacer cumplir una relacin entre los datos de dos tablas. Una restriccin FOREIGN KEY hace cumplir esta integridad referencial. La restriccin FOREIGN KEY define una referencia a una columna con una clave principal o restriccin 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 restriccin FOREIGN KEY: Una restriccin 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 Exposicin clave debe coincidir con el nmero de columnas y tipos de datos en REFERENCIAS la clusula. A diferencia de restricciones PRIMARY KEY o UNIQUE, restricciones FOREIGN KEY no crear ndices de forma automtica. Por otro usuario para crear una restriccin 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 creacin de un FOREIGN KEY que hace referencia a su tabla. Una restriccin FOREIGN KEY que utiliza slo la clusula REFERENCES sin la Clusula 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 RESTRICCIN clusula de las declaraciones CREATE TABLE y ALTER TABLE. El siguiente cdigo muestra la instruccin Transact-SQL utiliza para agregar una FOREIGN KEY restriccin a la tabla de Sales.SalesOrderHeader de la base de datos AdventureWorks. El ejemplo, se crea una restriccin FOREIGN KEY nombre FK_SalesOrderHeader_Customer_CustomerID que establece un vnculo 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 comprobacin 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 lgica de comprobacin de errores en sus aplicaciones y transacciones para poner a prueba si una restriccin ha sido violada. Puede desactivar slo CHECK y restricciones FOREIGN KEY. Usted puede ser til desactivar las restricciones cuando: Tiene que ejecutar un trabajo por lotes grandes o importacin 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 restriccin sobre una tabla que ya contiene datos. Como resultado, cada fila de datos slo es verificado por la restriccin.

Administracin de Base de Datos I

39

Para deshabilitar la comprobacin de restricciones cuando se agrega un CHECK o restriccin FOREIGN KEY para una tabla con los datos existentes, incluya la opcin WITH NOCHECK en la sentencia ALTER TABLE. Los datos existentes se verificarn nicamente durante las futuras actualizaciones de la columna. En el ejemplo siguiente se crea una restriccin FOREIGN KEY en la Tabla Sales.SalesOrderHeader y utiliza la opcin WITH NOCHECK para deshabilitar la verificacin 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 comprobacin 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 restriccin. Para deshabilitar una restriccin CHECK y FOREIGN KEY, utiliza la sentencia ALTER TABLE y se especifica la opcin NOCHECK. Lo contrario sera otra instruccin ALTER TABLE, esta vez con la opcin CHECK. En este ejemplo se desactiva la restriccin FK_SalesOrderHeader_Customer_CustomerID. ALTER TABLE [Sales].[SalesOrderHeader] NOCHECK CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID] En este ejemplo se vuelve a habilitar la restriccin FK_SalesOrderHeader_Customer_CustomerID. ALTER TABLE [Sales].[SalesOrderHeader] CHECK CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID]

Administracin de Base de Datos I

40

Prctica: Creacin de restricciones


Objetivo El objetivo de esta prctica es para que usted pueda crear restricciones mediante el uso de Transact-SQL. Preparacin Asegrese de que la mquina virtual se est ejecutando Si una mquina virtual no se ha iniciado, siga los siguientes pasos: 1. Cierre todas las otras mquinas virtuales. 2. Inicie la mquina virtual. Para crear una restriccin CHECK utilizando Transact-SQL Usted debe realizar los pasos siguientes para crear una restriccin 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 botn Nueva consulta en la barra de herramientas. 4. En la nueva ventana, consulta en blanco, escriba el siguiente cdigo 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 botn Ejecutar.
6. Cuando el comando se ha completado correctamente, haga clic en el restricciones y luego en Actualizar para comprobar que la restriccin CK_Employee_Gender ha sido creada. 7. Haga clic en el botn Nueva consulta en la barra de herramientas. 8. En la nueva ventana, consulta en blanco, escriba el siguiente cdigo 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 botn Ejecutar. 10. Compruebe que se devuelve un error porque la actualizacin en conflicto con la verificacin restriccin. 11. Mantenga SQL Server Management Studio abierto. Lo utilizar en el siguiente

Administracin de Base de Datos I

41

Para crear una restriccin Default mediante Transact-SQL Debe realizar los siguientes pasos para crear una restriccin DEFAULT mediante Transact-SQL: 1. En SQL Server Management Studio, haga clic en el botn Nueva consulta en la barra de herramientas. 2. En la nueva ventana, consulta en blanco, escriba el siguiente cdigo 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 botn 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 restriccin DF_Employee_ModifiedDate ha sido creada. 5. Haga clic en el botn Nueva consulta en la barra de herramientas .

Administracin de Base de Datos I

42

Contenidos
- Leccin 01: Creacin de ndices. - Leccin 02: Implementacin de Consultas ____________________________________________________________________________

ndices
Una vez que haya decidido lo que desea indizar y si desea usar un clster o ndice no agrupado, debe crear el ndice. Muchas opciones estn 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 leccin, obtendr informacin sobre cmo crear ndices y cmo utilizar algunas de las opciones de configuracin de clave de ndice para mejorar la utilidad, rendimiento y facilidad de mantenimiento los ndices que usted cree.

Planificando ndices
Un ndice es una coleccin de pginas relacionadas con una tabla (o vista) se utiliza para acelerar la recuperacin de filas de la tabla o cumplir la unicidad. Microsoft SQL Server 2008 utiliza los ndices para que apunte a la ubicacin de una fila en una pgina de datos en lugar de tener que mirar a travs de todas las pginas de datos de una tabla. Un ndice contiene claves construido a partir de una o ms 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 rpida y eficiente.

Administracin de Base de Datos I

43

En esta leccin, obtendr informacin sobre las tres opciones fundamentales de indexacin ofrecidos por SQL Server 2008: Los ndices agrupados, ndices no agrupados e ndices nicos. Usted aprender las ventajas y desventajas de cada opcin y ser capaz de identificar cundo usar cada opcin.

Cmo es el Accesos de datos de SQL Server?


SQL accede a los datos en un servidor de dos maneras: Al explorar todas las pginas de datos en una tabla, es llamada una exploracin 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 slo las filas necesarias que respondan a los criterios de la consulta.

Administracin de Base de Datos I

44

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 pgina en un btree se llama un nodo de ndice. El nodo superior del rbol B se denomina el nodo raz. El nivel inferior de los nodos del ndice se denomina el nivel hoja. Cualquier ndice de niveles entre el nodo raz y los nodos hoja se conocen colectivamente como los nodos intermedios. Cada pgina en los niveles intermedio o inferior tiene un puntero a la pgina anterior y posterior, formando una lista doblemente enlazada. Esta estructura proporciona un mecanismo muy eficaz para acelerar el proceso de localizacin de datos. En un ndice agrupado, la raz y los nodos intermedios contienen las pginas de ndice explotacin filas de ndice. Cada fila de ndice contiene un valor clave y un puntero a una intermediatelevel, pgina en la B-rbol o una fila de datos en el nivel hoja del ndice. Las pginas de cada nivel del ndice estn 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 slo puede tener un ndice agrupado las filas de la tabla no se puede almacenar en ms de un orden. Cuando utilizar un ndice agrupado Debido a que slo puede tener un ndice agrupado por tabla, debe asegurarse de que utiliza que para lograr el mximo beneficio posible. Antes de crear un ndice agrupado, Necesitamos entender cmo 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 ms adecuadas para ciertos tipos de datos y patrones de uso. Los ndices agrupados son ms 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 fsicamente en orden del ndice, despus de la fila con el primer valor se encuentra utilizando el ndice agrupado, las filas con la consiguiente indexados. Los valores estn garantizados para estar fsicamente adyacentes. Retorno de datos ordenados mediante el ORDER BY o GROUP BY. Un ndice sobre la columnas especificadas en la clusula ORDER BY o GROUP BY puede eliminar la necesidad de ordenar los datos porque los registros estn ya clasificados. Esta mejora el rendimiento de la consulta. Retorno de datos combinados utilizando clusulas 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 nmero columnas como sea posible.

Administracin de Base de Datos I

45

Cundo no utilizar ndices agrupados Los ndices agrupados no son una buena opcin cuando: Los datos de las columnas indizadas cambian con frecuencia. Los cambios en un clster ndice significa que toda la fila de los datos debe ser movido. Esto es una importante consideracin en los sistemas de alto volumen de procesamiento de transacciones en las que los datos se muy voltiles. La clave de ndice son anchas. Las claves anchas, son las claves compuestas de varias columnas o varias columnas de gran tamao. Todos los ndices no agrupados utilizan los valores de la clave de la ndice agrupado como claves de bsqueda. 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 pginas de ndice en lugar de pginas 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 mltiples formas de bsqueda de datos. Por ejemplo, un usuario frecuente puede buscar a travs de una base de datos en busca de una jardinera tanto lo comn y los nombres cientficos de las plantas. Se puede crear un ndice no agrupado para la recuperacin de los nombres cientficos 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 clster o ndice no agrupado, debe crear el ndice. Muchas opciones estn 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 leccin, obtendr informacin sobre cmo crear ndices y cmo utilizar algunas de las clave de ndice, opciones de configuracin 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 instruccin 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 } ]

Administracin de Base de Datos I

46

El cdigo siguiente, crea un ndice no agrupado de nombre AK_Employee_LoginID, ascendente en la columna IdDeInicioDeSesin 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. Creacin 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

Administracin de Base de Datos I

47

C. Creacin 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

Implementacin de Consultas
Las consultas permiten recuperar informacin 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: Seleccin.Cuando filtras ciertos registros, esto implica definir una condicin con la clusula WHERE.

TABLA
columna1 1 2 3 4 5 6 7 8 columna2 columna3 columna4 columna5

Proyeccin.Cuando se define que columnas o campos se quiere visualizar, esto se escribe despus del Comando SELECT.

TABLA
columna1 1 2 3 4 5 6 7 8 columna2 columna3 columna4 columna5

Administracin de Base de Datos I

48

OPERADORES RELACIONALES:
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 comparacin con modelo o patrn

OPERADORES LGICOS:
OPERADORES LGICOS AND (&&) Y OR O NOT Negacin

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 condicin 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
ALL TOP DISTINCT

Descripcin
Devuelve todos los campos de la tabla Devuelve un determinado nmero de registros de la tabla Omite los registros cuyos campos seleccionados coincidan totalmente

Administracin de Base de Datos I

49

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 instruccin 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 ms rpido indicar el listado de campos deseados. USE AdventureWorks2008R2; GO SELECT ALL * FROM HumanResources.Employee; GO TOP Devuelve un cierto nmero de registros que entran al principio o al final de un rango especificado por una clusula 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 tambin hacer uso de la clusula 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 instruccin 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.

Administracin de Base de Datos I

50

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 opcin de solicitar la devolucin del resultado de una consulta FOR XML como tipo de datos xml especificando la directiva TYPE. Clusulas: RAW [('ElementName')] Obtiene el resultado de la consulta y transforma cada fila del conjunto de resultados en un elemento XML con un identificador genrico <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 sera 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 clusula FROM de la que al menos se presenta una columna en la clusula SELECT se representa como un elemento XML. A las columnas presentadas en la clusula 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

Administracin de Base de Datos I

51

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 explcitamente. Con este modo, es necesario escribir las consultas de una cierta manera, de modo que se pueda especificar explcitamente informacin adicional acerca de la anidacin deseada.
PATH

Facilita la mezcla de elementos y atributos, as como la especificacin de anidacin 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 ms 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 ms fcil. Ofrece una alternativa para escribir la mayora 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. Tambin 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 vaca (FOR XML PATH ('')), no se generar ningn 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.

Administracin de Base de Datos I

52

ELEMENTS Si se especifica la opcin ELEMENTS, las columnas se devuelven como subelementos. Sin embargo, se les asignan atributos XML. Esta opcin solo se admite en los modos RAW, AUTO y PATH. Tambin 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 ningn 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 sera:

<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. Tambin se puede especificar el nombre del elemento raz 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)

Administracin de Base de Datos I

53

Funciones Integradas de SQL Server 2008


SQL Server proporciona numerosas funciones integradas y permite crear funciones definidas por el usuario. En esta pgina se muestra una lista de las categoras integradas. Entre ellas, se tiene a las funciones de agregado, de conversin, de cadena, matemticas, etc. Se har un reconocimiento de las funciones cadena, fecha y conversin, Funciones de cadena Estas funciones escalares realizan una operacin sobre un valor de cadena de entrada y devuelven un valor de cadena o un valor numrico: ASCII Devuelve el valor de cdigo ASCII del carcter situado ms a la izquierda de una expresin de caracteres. Sintaxis ASCII ( character_expression ) Ejemplo: Print ASCII(A) CHAR Devuelve el carcter de un cdigo ASCII. Sintaxis CHAR ( cdigo_ASCII ) Ejemplo: Print CHAR(66) LEFT Devuelve la parte izquierda de una cadena de caracteres segn el nmero de caracteres especificado Sintaxis LEFT ( expresin_cadena, nmero_de_caracteres) Ejemplo: USE AdventureWorks2008R2; GO SELECT LEFT(Name, 5) FROM Production.Product ORDER BY ProductID; GO SELECT LEFT('abcdefg',2) GO

Administracin de Base de Datos I

54

LEN Devuelve el nmero de caracteres de la expresin de cadena especificada, con exclusin de los espacios al final. Sintaxis LEN ( expresin_cadena) Ejemplo: USE AdventureWorks2008R2; GO SELECT LEN(FirstName) AS Length, FirstName, LastName FROM Sales.vIndividualCustomer WHERE CountryRegionName = 'Australia'; GO LOWER Devuelve una expresin de cadena especificada, convertida a minscula. Sintaxis LOWER ( expresin_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 expresin de caracteres tras quitar todos los espacios iniciales en blanco. Sintaxis LTRIM ( expresin_cadena) Ejemplo: PRINT LTRIM( Bienvenido a SQL Developer Edition)

NCHAR Devuelve el carcter Unicode correspondiente al cdigo entero dado. Sintaxis NCHAR ( valor_entero ) Ejemplo: PRINT NCHAR(248)

Administracin de Base de Datos I

55

PATINDEX Devuelve la posicin inicial de la primera aparicin de un patrn en una expresin especificada o ceros si el patrn no se encuentra, de todos los textos vlidos y tipos de datos de caracteres. Sintaxis PATINDEX ( '%patrn%' , expresin ) Ejemplo: PRINT PATINDEX('%au%','Jose Maurinho') REPLACE Reemplaza todas las instancias de un valor de cadena especificado por otro valor de cadena. Sintaxis REPLACE ( expresin_cadena, patrn_cadena, cadena_a_reemplazar ) Ejemplo: SELECT REPLACE('abcdefghicde','cde','xxx'); GO REPLICATE Repite un valor de cadena, un nmero determinado de veces. Sintaxis REPLICATE ( expresin_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 ( expresin_cadena)

Administracin de Base de Datos I

56

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, segn el nmero de caracteres especificado Sintaxis LEFT ( expresin_cadena, nmero_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 despus de truncar todos los espacios en blanco finales. Sintaxis RTRIM ( expresin_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 )

Administracin de Base de Datos I

57

STR Devuelve datos de caracteres convertidos a partir de datos numricos. Sintaxis STR ( valor_float, longitud, cantidad_decimales) Ejemplo: PRINT STR(7559.5670, 7, 2) STUFF La funcin STUFF inserta una cadena en otra. Elimina una longitud determinada de caracteres de la primera cadena a partir de la posicin de inicio y, a continuacin, inserta la segunda cadena en la primera, en la posicin de inicio. Sintaxis STUFF ( expresin_cadena, inicio, longitud , expresin_cadena2 ) Ejemplo: PRINT STUFF('abcdef', 2, 3, 'ijklmn'); GO SUBSTRING Devuelve una cadena a partir de otra, desde una determinada posicin, cierta cantidad de caracteres. Sintaxis SUBSTRING ( expresin_cadena, posicin_inicial, longitud) Ejemplo: PRINT SUBSTRING('Walter Javier',8,4) GO UNICODE Devuelve el valor entero, segn la definicin del estndar Unicode, para el primer carcter de la expresin de entrada. Sintaxis UNICODE ( carcter_Unicode ) Ejemplo: PRINT UNICODE('') GO UPPER Devuelve una expresin de caracteres minsculas convertidos en maysculas. Sintaxis UPPER ( expresin_cadena )

Administracin de Base de Datos I

58

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

Administracin de Base de Datos I

59

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 precisin 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 versin de Windows en las que la instancia de SQL Server se est ejecutando. La precisin de esta API se fija en 100 nanosegundos. La precisin se puede determinar mediante la API de Windows GetSystemTimeAdjustment().

Administracin de Base de Datos I

60

Funcin

Sintaxis

Valor devuelto

Tipo de datos devuelto datetime2(7)

Determinismo

http://msdn.microsoft.com/es- SYSDATETIME () es/library/bb630353.aspx

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.

No determinista

http://msdn.microsoft.com/es- SYSDATETIMEOFFSET Devuelve un es/library/bb677334.aspx


() 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- SYSUTCDATETIME ( ) es/library/bb630387.aspx

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

Administracin de Base de Datos I

61

Funciones de fecha y hora del sistema de precisin baja


Funcin Sintaxis Valor devuelto Tipo de datos devuelto Determinismo

http://msdn.microsoft.com/es- CURRENT_TIMESTAMP Devuelve un es/library/ms188751.aspx


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. 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. GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime2(7 ) que contiene la fecha y hora

datetime No determinista

datetime No determinista

datetime No determinista

Administracin de Base de Datos I

62

Funciones que obtienen partes de la fecha y hora Funcin Sintaxis Valor devuelto Tipo de datos devuelto nvarchar Determinismo

DATENAME DATENAME ( datepart , date )

Devuelve una cadena de caracteres que representa el datepart especificado de la fecha especificada.

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 da 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 ao de un date especificado.

int

Determinista

Funciones que obtienen diferencias de fecha y hora Funcin Sintaxis Valor devuelto Tipo de datos devuelto int Determinismo

DATEDIFF DATEDIFF ( , enddate )

Devuelve el nmero de lmites dos fechas especificadas.

Determinista

datepart , startdate datepart de fecha y hora entre

Administracin de Base de Datos I

63

Funciones que modifican valores de fecha y hora


Funcin Sintaxis Valor devuelto Tipo de datos devuelto Determinismo

DATEADD

DATEADD (datepart , number , date )

Devuelve un nuevo El tipo de datos valor datetime agregando un intervalo al datepart especificado del dateespecificado. del argumento date.

Determinista

http://msdn.microsoft.com/es- SWITCHOFFSET es/library/bb677244.aspx


(DATETIMEOFFSET , time_zone)

SWITCH OFFSET cambia el ajuste de zona horaria de un valor DATETIMEOFFSET y conserva el valor UTC.

datetimeoffset con la precisin fraccionaria de DATETIMEOFFSE T

Determinista

http://msdn.microsoft.com/es- TODATETIMEOFFSET TODATETIMEOFFSET datetimeoffset es/library/bb630335.aspx


(expression , time_zone) transforma un valor datetime2 en un con la precisin fraccionaria del

Determinista

valor datetimeoffset. argumento El valor datetime2 se interpreta en la hora local para el valor time_zone especificado. datetime

Administracin de Base de Datos I

64

Funciones que establecen u obtienen un formato de sesin Funcin Sintaxis Valor devuelto Tipo de datos devuelto tinyint Determinism o

http://msdn.microsoft.com/es -es/library/ms187766.aspx

@@DATEFIRS T

Devuelve el valor actual, para la sesin, de SET DATEFIRST.

No determinista

http://msdn.microsoft.com/es -es/library/ms181598.aspx

SET DATEFIRST { number | @number_var }

Establece el primer da de la semana en un nmero del 1 al 7.

No aplicabl e

No aplicable

http://msdn.microsoft.com/es -es/library/ms189491.aspx

SET format | @format_var }

Determina el componentes de la fecha (mes/da/ao) para escribir datos de tipo datetime o smalldatetime.

No aplicabl e

No aplicable

DATEFORMAT { orden de los

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 funcin de fecha u hora. Sin embargo, la configuracin de idioma puede afectar a la salida de las funciones de

No aplicabl e

No aplicable

Administracin de Base de Datos I

65

fecha.

http://msdn.microsoft.com/es -es/library/ms174398.aspx

SET LANGUAGE { [ N ] 'language' | @language_var }

Establece el entorno del idioma de la sesin y los mensajes del sistema. SET LANGUAGE no es ninguna funcin de fecha u hora. Sin embargo, la configuracin de idioma afecta a la salida de las funciones de fecha.

No aplicabl e

No aplicable

Funciones que validan valores de fecha y hora Funcin Sintaxis Valor devuelto Tipo de Determinismo datos devuelto int ISDATE slo es determinista si se utiliza con la funcin CONVERT, cuando se especifica el parmetro de estilo CONVERT y cuando el estilo no es igual a 0, 100, 9 ni 109.

http://msdn.microsoft.com/eses/library/ms187347.aspx

ISDATE ( expression )

Determina si una expresin de entrada datetime o smalldatetime es un valor de fecha u hora vlido.

Administracin de Base de Datos I

66

Funciones de Conversin Utilice las funciones CAST y CONVERT para convertir expresiones de un tipo de datos a otro tipo de datos. Las funciones CAST y CONVERT tambin se puede utilizar para obtener una variedad de formatos de datos especiales y se pueden utilizar en la lista de seleccin, en la clusula WHERE y en cualquier lugar que se permita una expresin. Sintaxis de CAST: CAST ( expresin AS nuevo_tipo_dato [( longitud )] ) Sintaxis de CONVERT: CONVERT ( nuevo_tipo_dato [ ( longitud ) ] , expresin [ , 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

Administracin de Base de Datos I

67

Arreglos

Contenidos
- Leccin 1: Consultas multitablas - Leccin 2: Subconsultas ____________________________________________________________________________

Consultas Multitablas
La consultas multitablas es un requerimiento fundamental en los negocios de hoy en da, dado a que se quiere obtener informacin 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 ms tablas basadas en relaciones lgicas entre las tablas. Una condicin de combinacin define la forma en que las dos tablas estn relacionadas en una consulta, por ello se debe: Especificar la columna de cada tabla que se utilizar para la combinacin. Una unin tpica, es la condicin donde se indica la clave externa de una tabla y la clave asociada en la otra tabla (PK). Especificar un operador lgico (por ejemplo, = o <>,) para ser utilizado en la comparacin de los valores de las columnas.

Administracin de Base de Datos I

68

Las vinculaciones entre tablas se realizan mediante la clusula JOIN que combina registros de dos tablas siempre que haya concordancia de valores en un campo comn. 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 numricos, 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 comparacin 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 combinacin de los campos ContactID. Ejemplo 2. La combinacin no igual (<>) se usa con poca frecuencia. Como regla general, las combinaciones no igual slo tienen sentido cuando se usan con una autocombinacin. Por ejemplo, esta combinacin no igual Transact-SQL y la autocombinacin se usan para encontrar las subcategoras 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 operacin INNER JOIN en cualquier clusula FROM. Esto crea una combinacin por equivalencia, conocida tambin como unin interna. Las combinaciones aqu son las ms comunes; stas combinan los registros de dos tablas siempre que haya concordancia de valores en un campo comn 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 ningn empleado asignado) se emplea LEFT JOIN o todos los empleados (incluso si alguno no est asignado a ningn departamento), en este caso RIGHT JOIN.

Administracin de Base de Datos I

69

Tambin, 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 operacin de combinacin tpica, que usa algunos operadores de comparacin como = o <> ). INNER JOIN En este tipo se incluyen las combinaciones equivalentes y las combinaciones naturales. Las combinaciones internas usan un operador de comparacin para hacer coincidir las filas de dos tablas segn los valores de las columnas comunes de cada tabla. Un ejemplo sera recuperar todas las filas en las que el nmero de identificacin de estudiante es el mismo en las tablas students y courses. Ejemplo: Recupera los empleados que tambin son vendedores: USE AdventureWorks; GO SELECT e.EmployeeID FROM HumanResources.Employee AS e INNER JOIN Sales.SalesPerson AS s ON e.EmployeeID = s.SalesPersonID

Administracin de Base de Datos I

70

Combinaciones externas. Puede ser una combinacin externa izquierda, derecha o completa. Las combinaciones externas se especifican en la clusula FROM con uno de los siguientes conjuntos de palabras clave: LEFT JOIN o LEFT OUTER JOIN. El conjunto de resultados de una combinacin externa izquierda incluye todas las filas de la tabla de la izquierda especificada en la clusula LEFT OUTER y no slo 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 seleccin que procedan de la tabla de la derecha. Ejemplo: Imagine una combinacin 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 revisin para alguno de ellos, utilice una combinacin 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 combinacin externa derecha es lo contrario de una combinacin 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 combinacin 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 combinacin 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 estn asignados a un territorio de ventas, utilice una combinacin externa derecha ISO. A continuacin se muestra la consulta Transact-SQL y los resultados de la combinacin 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

Administracin de Base de Datos I

71

Ejemplo 2: Una combinacin externa puede restringirse ms mediante el uso de un predicado WHERE. Este ejemplo contiene la misma combinacin externa derecha, pero slo incluye los territorios de ventas con un volumen de ventas inferior a 2.000.000 de dlares: 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 combinacin 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 seleccin de la otra tabla contendrn 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 combinacin de la tabla Product y de la tabla SalesOrderDetail en sus columnas ProductID. Los resultados slo muestran los productos para los que se han efectuado pedidos de venta. El operador de combinacin 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 clusula WHERE con una combinacin externa completa para devolver solamente las filas donde no hay datos coincidentes entre las tablas. La siguiente consulta slo devuelve los productos que no tienen pedidos de venta que coincidan, as como los pedidos de venta que no coinciden con ningn 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 tambin productos cartesianos. Ejemplo 1: Una combinacin cruzada que no tenga una clusula WHERE genera el producto cartesiano de las tablas involucradas en la combinacin. El tamao del conjunto de resultados de un producto cartesiano es igual al nmero de filas de la primera tabla multiplicado por el nmero de filas de la segunda tabla. En el siguiente ejemplo se muestra una combinacin cruzada de Transact-SQL.

Administracin de Base de Datos I

72

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 clusula WHERE, la combinacin cruzada se comporta como una combinacin 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;

Administracin de Base de Datos I

73

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 expresin. En este ejemplo se utiliza una subconsulta como una expresin de columna denominada MaxUnitPrice en una instruccin 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 tambin llamado una consulta interna o interior seleccione, mientras que la declaracin que contiene una subconsulta tambin 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 instruccin SELECT externa tiene los siguientes componentes: Una consulta regular SELECCIONAR incluidos los componentes lista de seleccin regular. Una clusula FROM peridicos, incluyendo uno o ms nombres de tabla o vista. Una clusula WHERE opcional. Una clusula GROUP BY opcional. Una clusula HAVING opcional La consulta SELECT de una subconsulta es siempre entre parntesis. No puede incluir una clusula COMPUTE o FOR BROWSE, y slo puede incluir una clusula ORDER BY cuando una clusula TOP tambin se especifica. Una subconsulta puede anidarse dentro de la clusula 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 lmite vara segn la memoria disponible y la complejidad de otras expresiones en la consulta. consultas individuales no pueden apoyar anidacin hasta 32 niveles. Una subconsulta puede aparecer en cualquier lugar una expresin 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)

Administracin de Base de Datos I

74

Ejemplo 1: La siguiente consulta encuentra el nombre de todos los proveedores cuya calificacin crediticia es buena, de quien Adventure Works orden por lo menos 20 items, y un promedio de tiempo de entrega inferior a 16 das. 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' )

Administracin de Base de Datos I

75

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 revs como el que existe. La clusula WHERE de NOT EXISTS se cumple si no se devuelven filas de la subconsulta. El siguiente ejemplo busca los empleados que no estn 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

Administracin de Base de Datos I

76

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 clusula WHERE referencias de la tabla Purchasing.ProductVendor para restringir las filas actualiza en la tabla de productos que slo 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 combinacin 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 instruccin DELETE muestra la solucin con subconsulta eliminando filas de la tabla SalesPersonQuotaHistory basndose en las ventas del ao 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

Administracin de Base de Datos I

77

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

Administracin de Base de Datos I

78

Arreglos

Contenidos
- Leccin 1: Consultas agrupadas - Leccin 2: Funciones de grupo - Leccin 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 agrupacin. Para cada registro, se crea un valor sumario si se incluye una funcin SQL agregada, como SUM, AVG, MAX, MIN o COUNT (como veremos despus), en la instruccin SELECT.

Administracin de Base de Datos I

79

Clusula GROUP BY La clusula GROUP BY se usa para generar valores de agregado para cada fila del conjunto de resultados. Cuando se usan sin una clusula GROUP BY, las funciones de agregado slo devuelven un valor de agregado para una instruccin SELECT. Sintaxis: SELECT campos_a_agrupar, Funciones_agregado() FROM tabla WHERE condicin_campo GROUP BY campos_del_grupo HAVING condicin_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 Clusula HAVING Especifica una condicin de bsqueda para un grupo o agregado. HAVING slo se puede utilizar con la instruccin SELECT. Normalmente, HAVING se utiliza en una clusula GROUP BY. Cuando no se utiliza GROUP BY, HAVING se comporta como una clusula WHERE. Ejemplo: En el ejemplo siguiente, donde se utiliza una clusula 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 ;

Administracin de Base de Datos I

80

Funciones de Grupo
SUM() Devuelve la suma de todos los valores, o slo los valores distintos, en la expresin. SUM se puede utilizar con columnas numricas. 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

Administracin de Base de Datos I

81

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 clusula GROUP BY, cada funcin 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 bonificacin media percibida por el personal de ventas en cada territorio y la suma de las ventas del ao hasta la fecha de cada territorio. Su sintaxis es la siguiente: USE AdventureWorks2008R2; GO SELECT TerritoryID, AVG(Bonus)as 'Promedio de Bonificacin', SUM(SalesYTD) as Ventas por ao' FROM Sales.SalesPerson GROUP BY TerritoryID; GO Ejemplo 3: La instruccin 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 funcin AVG comprueba el precio de lista promedio de todos los productos de la tabla Product. USE AdventureWorks2008R2; GO SELECT AVG(ListPrice) FROM Production.Product;

Administracin de Base de Datos I

82

MAX() Devuelve el valor mximo en la expresin. Ejemplo 1: El ejemplo siguiente devuelve el ms alto (mximo) de impuestos. USE AdventureWorks2008R2; GO SELECT MAX(TaxRate) FROM Sales.SalesTaxRate; GO Ejemplo 2: La siguiente consulta muestra el precio ms 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 mnimo de la expresin. Ejemplo 1: El ejemplo siguiente devuelve la ms baja (mnima) tasa de impuestos. USE AdventureWorks2008R2; GO SELECT MIN(TaxRate) FROM Sales.SalesTaxRate; GO Ejemplo 2: El ejemplo visualiza los costos mnimos por cada color SELECT Color, MIN(StandardCost) As [Costo Mnimo] FROM Production.Product GROUP BY Color

Administracin de Base de Datos I

83

COUNT(). Devuelve el nmero de elementos de un grupo. COUNT funciona como la funcin 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 nmero de ttulos 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 nmero 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

Administracin de Base de Datos I

84

Vistas
Una Vista es una tabla virtual cuyos contenidos (columnas y filas) se definen por una consulta. Utilice esta instruccin 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 percepcin que cada usuario tiene de la base de datos. Como un mecanismo de seguridad al permitir a los usuarios acceder a datos a travs 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. Creacin 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 condicin_de_grupo

Ejemplo 1: En el ejemplo siguiente se crea una vista utilizando una sentencia SELECT simple. A simple vista es til cuando una combinacin 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

Administracin de Base de Datos I

85

Ejemplo 2: En el ejemplo siguiente se utiliza la opcin 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

Administracin de Base de Datos I

86

Ejemplo 4: El siguiente ejemplo muestra una definicin de la vista que incluye una funcin 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 Modificacin 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 condicin_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 slo 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 declaracin 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

Administracin de Base de Datos I

87

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

Administracin de Base de Datos I

88

Arreglos

Contenidos
- Leccin 1: Integracin 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 agrupacin.

Administracin de Base de Datos I

89

Arreglos

Contenidos
- Leccin 1: Procedimiento almacenados ____________________________________________________________________________

Programacin Transact SQL


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

Administracin de Base de Datos I

90

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 ejecucin para que la subsiguiente ejecucin sea muy rpida. Los procedimientos almacenados pueden: Incluir parmetros 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 razn de dicho fallo. Devolver valores de parmetros 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 ejecucin de las instrucciones y lotes de SQL de forma dramtica. Adems los procedimientos almacenados pueden ejecutarse en otro SQL Server si el servidor del usuario y el remoto estn configurados para permitir logins remotos. Los procedimientos almacenados se diferencian de las instrucciones SQL ordinarias y de lotes de instrucciones SQL en que estn precompilados. La primera vez que se ejecuta un procedimiento, el procesador de consultas SQL Server lo analiza y prepara un plan de ejecucin que se almacena en forma definitiva en una tabla de sistema, Posteriormente, el procedimiento se ejecuta segn 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 instantnea. 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. Tambin, puede utilizar el nombre del procedimiento almacenado solo, siempre que sea la primera palabra de una instruccin 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 propsito especfico. Los procedimientos almacenados del sistema se agrupan en las categoras que aparecen en la siguiente tabla. Categora Procedimientos almacenados de Active Directory Descripcin Se utilizan para registrar instancias de SQL Server y bases de datos de SQL Server en Active Directory de Microsoft Windows 2000. Se utilizan para implementar las funciones del diccionario de datos ODBC y aislar las aplicaciones ODBC de los cambios en las tablas subyacentes del

Procedimientos almacenados del catlogo

Administracin de Base de Datos I

91

sistema. Procedimientos almacenados de captura de datos modificados Procedimientos almacenados de cursor Procedimientos almacenados del motor de base de datos Permiten habilitar, deshabilitar o informar sobre los objetos de la captura de datos modificados. Se utilizan para implementar la funcionalidad de variable de cursor. Se utilizan para el mantenimiento general del SQL Server Database Engine (Motor de base de datos de SQL Server). Se utilizan para realizar operaciones de correo electrnico desde una instancia de SQL Server.

Procedimientos almacenados de Correo electrnico de base de datos y SQL Mail Procedimientos almacenados de planes de mantenimiento de bases de datos Procedimientos almacenados de consultas distribuidas Procedimientos almacenados de la bsqueda de texto completo Procedimientos almacenados del trasvase de registros Procedimientos almacenados de automatizacin Procedimientos almacenados de administracin basada en directivas Procedimientos almacenados de replicacin Procedimientos almacenados de seguridad Procedimientos almacenados de SQL Server Profiler

Se utilizan para configurar las tareas de mantenimiento fundamentales necesarias para administrar el rendimiento de las bases de datos. Se utilizan para implementar y administrar consultas distribuidas. Se utilizan para implementar y consultar ndices de texto completo. Se utilizan para establecer, modificar y supervisar las configuraciones de trasvase de registros. Permiten habilitar el uso de objetos de automatizacin estndar en un lote estndar de Transact-SQL. Se usan para la administracin basada en directivas.

Se utilizan para administrar la replicacin.

Se utilizan para administrar la seguridad.

Lo utiliza SQL Server Profiler para supervisar el rendimiento y la actividad.

Administracin de Base de Datos I

92

Procedimientos almacenados del Agente SQL Server Procedimientos almacenados de XML Procedimientos almacenados extendidos generales

Los utiliza el Agente SQL Server para administrar actividades programadas y controladas por eventos. Se utilizan para la administracin del texto XML.

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_add_log_file_recover_suspect_db sp_addextendedproc sp_addextendedproperty sp_addmessage sp_addtype sp_addumpdevice sp_altermessage sp_attach_db sp_attach_single_file_db sp_autostats sp_bindefault sp_bindrule sp_bindsession sp_dropmessage sp_droptype sp_executesql sp_getapplock sp_getbindtoken sp_help sp_helpconstraint sp_helpdb sp_helpdevice sp_helpextendedproc sp_helpfile sp_helpfilegroup sp_helpindex sp_helplanguage

Administracin de Base de Datos I

93

sp_certify_removable sp_clean_db_file_free_space sp_clean_db_free_space sp_configure sp_control_plan_guide sp_create_plan_guide sp_create_plan_guide_from_handle sp_create_removable sp_createstats sp_cycle_errorlog sp_datatype_info sp_dbcmptlevel sp_dbmmonitoraddmonitoring sp_dbmmonitorchangealert sp_dbmmonitorchangemonitoring sp_dbmmonitordropalert sp_dbmmonitordropmonitoring sp_dbmmonitorhelpalert sp_dbmmonitorhelpmonitoring sp_dbmmonitorresults

sp_helpserver sp_helpsort sp_helpstats sp_helptext sp_helptrigger sp_indexoption sp_invalidate_textptr sp_lock sp_monitor sp_procoption sp_recompile sp_refreshview sp_releaseapplock sp_rename sp_renamedb sp_resetstatus sp_serveroption sp_setnetname sp_settriggerorder sp_spaceused

Administracin de Base de Datos I

94

sp_dboption sp_dbremove sp_delete_backuphistory sp_depends sp_detach_db sp_dropdevice sp_dropextendedproc sp_dropextendedproperty

sp_tableoption sp_unbindefault sp_unbindrule sp_updateextendedproperty sp_updatestats sp_validname sp_who

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 estn definidas por el usuario, mientras que las variables globales las suministra el sistema y estn predefinidas. Variables Globales: Las variables globales son variables predefinidas suministradas por el sistema. Se distinguen de las variables locales por tener dos smbolos @. Estas son algunas variables globales del servidor:

Variable

@@error

@@identity @@Version @@ServerName @@Language

Contenido Contiene 0 si la ltima transaccin se ejecut de forma correcta; en caso contrario, contiene el ltimo nmero 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 instruccin insert @@Version Devuelve el Nombre del Servidor Devuelve el nombre del idioma en uso

Administracin de Base de Datos I

95

Variables Globales: Las variables locales son variables definidas por el usuario. Los nombres de las variables Locales deben empezar con el smbolo @. 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 -- Declaracin DECLARE @nombre varchar(20) DECLARE @fechanac datetime DECLARE @sueldo numeric(8,2) -- Asignacin SET @nombre='Javier' SET @fechanac='21/02/1980' SET @sueldo=1250.50 -- Impresin de valores PRINT @nombre PRINT @fechanac PRINT @sueldo O

USE AdventureWorks2008R2 ; GO -- Declaracin DECLARE @nombre varchar(20) DECLARE @fechanac datetime DECLARE @sueldo numeric(8,2) -- Asignacin SELECT @nombre='Javier' SELECT @fechanac='21/02/1980' SELECT @sueldo=1250.50 -- Impresin de valores PRINT @nombre PRINT @fechanac PRINT @sueldo

Administracin de Base de Datos I

96

Las variables tambin puede asumir un valor resultado de una consulta. USE AdventureWorks2008R2 ; GO -- Declaracin DECLARE @nombre varchar(20) DECLARE @fechanac datetime DECLARE @sueldo numeric(8,2) -- Asignacin SET @nombre= (SELECT TOP 1 FirstName + SPACE(1) + LastName FROM Person.Contact ) SET @fechanac=GETDATE() SET @sueldo=(SELECT MAX(Bonus) FROM Sales.SalesPerson ) -- Impresin 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))

Administracin de Base de Datos I

97

Control de flujo y palabras claves relacionadas.

Control de Flujo y palabras claves Relacionadas Palabra Clave Funcin


Define una Ejecucin condicional. Define una ejecucin alternativa cuando la condicin ..ELSE IF es falsa BEGIN Comienzo de un bloque de instrucciones ..END Final de un bloque de instrucciones Repite la ejecucin de instrucciones mientras la WHILE condicin es verdadera BREAK Sale del final del siguiente bucle mas exterior .CONTINUE Reinicio del bucle while DECLARE Declara variables locales RETURN Sale de forma incondicional Imprime un mensaje definido por el usuario o una PRINT variable local en la pantalla del usuario Inserta un comentario en cualquier punto de una /* COMENTARIO */ instruccin SQL Inserta una lnea de comentario en cualquier punto -- COMENTARIO de una instruccin SQL. CASE Permite que se muestre una valor alternativo

IF

Administracin de Base de Datos I

98

CREATE PROCEDURE. Crea un procedimiento almacenado. Un procedimiento almacenado es una coleccin guardada de instrucciones Transact-SQL o una referencia a una aplicacin Microsoft. NET Framework Common Language (CLR) mtodo que puede tomar y devolver los parmetros proporcionados por el usuario. Los procedimientos se pueden crear para uso permanente o temporal para el uso dentro de un perodo de sesiones, procedimiento local temporal, o para el uso temporal en todas las sesiones, procedimiento temporal global. Los procedimientos almacenados tambin se pueden crear para ejecutarse automticamente cuando una instancia de SQL Server se inicia. Sintaxis: CREATE PROCEDURE nombre_procedimiento Lista_de_parmetros AS Sentencias T-SQL GO Ejemplo 1: El siguiente procedimiento almacenado devuelve todos los empleados (nombres y apellidos incluidos), sus ttulos profesionales, y sus nombres de departamentos desde una vista. Este procedimiento almacenado no utiliza ningn parmetro. 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 instruccin dentro del lote: HumanResources.uspGetAllEmployees;

Administracin de Base de Datos I

99

Ejemplo 2: El siguiente procedimiento almacenado devuelve slo el empleado especificado (nombre y apellido suministrado), su ttulo y su nombre de departamento de una vista. Este procedimiento almacenado acepta coincidencias exactas de los parmetros 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 cmo puede crear un procedimiento almacenado que devuelve un conjunto de filas de todos los productos que tengan ms de un da a la fabricacin CREATE PROC Production.LongLeadProducts AS SELECT Name, ProductNumber FROM Production.Product WHERE DaysToManufacture >= 1 GO El procedimiento se ejecuta. EXEC Production.LongLeadProducts

Administracin de Base de Datos I

100

ALTER PROCEDURE. Comando utilizado para modificar procedimientos. Sintaxis: ALTER PROCEDURE nombre_procedimiento Lista_de_parmetros 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. Despus 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

Administracin de Base de Datos I

101

En el ejemplo siguiente cambia el procedimiento almacenado uspVendorAllInfo (sin la opcin EXECUTE AS) para volver slo 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

Administracin de Base de Datos I

102

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

Administracin de Base de Datos I

103

Arreglos

Contenidos
- Leccin 1: Concepto de Parmetros - Leccin 2: Validando datos - Leccin 3: Invocando otros procedimientos - Leccin 4: Optimizando operaciones / Transacciones ____________________________________________________________________________

Parmetros
Los parmetros son como variables, que se definen en un procedimiento o funcin y que permitirn recepcionar un valor para poderlo utilizar dentro de la estructura. Tambin hay parmetros que devolvern un valor.

Administracin de Base de Datos I

104

Uso de Parmetros Ejemplo 1: USE AdventureWorks; GO CREATE PROCEDURE USP_EmployeeStatusMarital @ao smallint AS SELECT * FROM HumanResources.Employee WHERE DATEPART (YY,BirthDate) = @ao 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 'Cdigo de error no existe' END PRINT @msg GO Ejecutar EXEC USP_Mensaje 2

Administracin de Base de Datos I

105

Validando datos / Invocando a otros procedimientos Ejemplo 1: El procedimiento almacenado recibe como parmetro los campos de la tabla Sales.Currency, validando que los dato no sean nulos, y que el cdigo 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 parmetro 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()

Administracin de Base de Datos I

106

El @ DeptID es el parmetro de salida de la identidad del nuevo registro, la funcin SCOPE_IDENTITY muestra el valor generado automticamente en el nmero de identificacin. 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

Administracin de Base de Datos I

107

Optimizando operaciones o transacciones Ejemplo 1: En el siguiente ejemplo se utiliza una instruccin UPDATE en un procedimiento almacenado. El procedimiento acepta un parmetro de entrada ,@NewHours. El valor del parmetro se utiliza en la instruccin UPDATE para actualizar la columna VacationHours de la tabla HumanResources.Employee. La expresin CASE se utiliza en la clusula 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 nmero actual de horas ms 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 parmetro 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 parmetro 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;

Administracin de Base de Datos I

108

Arreglos

Contenidos
- Leccin 1: Funciones - Leccin 2: Trigger ____________________________________________________________________________

Funciones
Las funciones son rutinas formado por una o ms instrucciones Transact-SQL que puede ser utilizada para encapsular el cdigo para su reutilizacin. Una funcin toma cero o ms parmetros de entrada y devuelve un valor escalar o una tabla. Los parmetros de entrada puede ser cualquier tipo de datos, excepto TimeStamp, Cursor, o tabla, las funciones no son compatibles con los parmetros 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 solucionarn los problemas de reutilizacin del cdigo y dar mayor flexibilidad al programar las consultas de SQL. Estas funciones a su vez se clasifican en: Funciones Escalares Funcin de Tabla en Lnea Funcin de Tabla de MultiSentencia.

Administracin de Base de Datos I

109

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_funcin (lista de parmetros) RETURNS tipo_dato_a_devolver AS BEGIN Lgica_de_funcin --- ----- ---------- ------- -----RETURN dato_a_devolver END Ejemplo 1: En el ejemplo siguiente se crea una funcin 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 funcin definida por el usuario devuelve un valor escalar, se puede invocar en cualquier lugar que permita una expresin del mismo tipo de datos. Los siguientes tabla contiene ejemplos en los que se pueden utilizar funciones escalares. rea Consultas Ejemplo Como una expresin en la select_list de una instruccin SELECT. Como una expresin o Expresion_cadena en un caso o La clusula HAVING. Como group_by_expression en una clusula GROUP BY. Como order_by_expression en una clusula ORDER BY. Como una expresin en la clusula SET de una instruccin UPDATE. Como una expresin en la clusula VALUES de una instruccin INSERTdeclaracin. restricciones CHECK. Las funciones pueden referirse slo a Columnas en la misma tabla. DEFAULT definiciones. Funciones slo puede contener constantes. Columnas calculadas. Las funciones pueden referirse slo a Columnas en la misma tabla.

Tabla definicin

Administracin de Base de Datos I

110

rea Declaraciones Transact-SQL

Ejemplo En los operadores de asignacin. En las expresiones de Booleanas de las instrucciones de control de flujo. En las expresiones CASE. En declaraciones IMPRIMIR (slo para funciones que devuelven un cadena de caracteres). Como argumentos de la funcin. En la declaracin de un procedimiento almacenado RETURN (slo para funciones escalar que devuelven un entero). En la declaracin de un procedimiento almacenado RETURN (slo para funciones escalar que devuelven un entero).

Funciones y Procedimientos Almacenados

El ejemplo siguiente realiza una instruccin SELECT que recupera el ProductID, el Nombre, y el resultado de la funcin 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 lnea para conseguir la funcionalidad de puntos de vista con parmetros. Uno de las limitaciones de una vista es que no se les permite incluir un parmetro proporcionado por el usuario.. Por lo general, puede resolver esto proporcionando una clusula WHERE cuando se llama a la vista. Sin embargo, esto podra requerir la construccin de una cadena para una ejecucin dinmica, que puede aumentar la complejidad de la solicitud. Puede alcanzar las funcionalidades de una vista con parmetros mediante el uso de una funcin en lnea con valores de tabla. Considere las siguientes caractersticas en lnea con valores de tabla de funciones definidas por el usuario. La declaracin RETURNS especifica la tabla como el tipo de datos devuelto. El conjunto de resultados de la instruccin SELECT define el formato de una variable de retorno. La clusula RETURN contiene una sola instruccin SELECT en parntesis. La instruccin SELECT utilizada en una funcin en lnea est sujeta a las mismas restricciones que las instrucciones SELECT utilizada en las vistas. El cuerpo de la funcin no tiene por qu ser encerrado en un bloque de BEGIN ... END. Ejemplo 1: En el ejemplo siguiente se crea una funcin con valores de tabla en lnea que devuelve los nombres de empleados de un gerente en particular en la base de datos AdventureWorks.

Administracin de Base de Datos I

111

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 funcin: SELECT * FROM HumanResources.EmployeesForManager(3) -- OR SELECT * FROM HumanResources.EmployeesForManager(6) Ejemplo 2: El ejemplo siguiente devuelve una funcin en lnea con valores de tabla. Devuelve tres columnas ProductID, Name y el agregado de los totales del ao 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 funcin: SELECT * FROM Sales.ufn_SalesByStore (602);

Administracin de Base de Datos I

112

Funciones de tabla Multisentencias. Una funcin con valores de tabla de mltiple sentencia es una combinacin 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 funcin con valores de tabla (como un procedimiento almacenado) puede utilizar una lgica compleja y mltiple Transact-SQL para crear una tabla. De la misma manera que utiliza una vista, puede utilizar una funcin con valores de tabla en la clusula FROM de una instruccin de Transact-SQL. Considere las siguientes caractersticas de funciones de mltiples 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 funcin. Puede utilizar las funciones en lnea para conseguir la funcionalidad de puntos de vista con parmetros. 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 funcin del parmetro 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 funcin: SELECT * FROM HumanResources.EmployeeNames('LONGNAME') -- OR SELECT * FROM HumanResources.EmployeeNames('SHORTNAME')

Administracin de Base de Datos I

113

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

Administracin de Base de Datos I

114

Trigger
Un disparador es un tipo especial de procedimiento almacenado que se ejecuta cuando una instruccin 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 lgicamente en diferentes tablas. Se puede utilizar disparadores para hacer cumplir la lgica 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 modificacin de datos que deben disparar o activar el disparador. Luego, se indica la accin o acciones que debe llevar a cabo un disparador. Sintaxis 01: CREATE TRIGGER nombre_trigger ON nombre_tabla FOR operacin AS -----. GO Sintaxis 02: CREATE TRIGGER nombre_trigger ON nombre_tabla AFTER operacin AS -----. GO Sintaxis 03: CREATE TRIGGER nombre_trigger ON nombre_tabla INSTEAD OF operacin AS -----. GO

Administracin de Base de Datos I

115

Ejemplo 1 : El cdigo siguiente muestra la creacin 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 ejecucin 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

Administracin de Base de Datos I

116

Ejemplo 3: En el ejemplo siguiente se enva un mensaje de correo electrnico a un amigo especfico (MaryM) cuando la tabla Customer tiene cambios, se ingresa datos o si se elimina algn 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 = 'danw@Adventure-Works.com', @body = 'Don''t forget to print a report for the sales force.', @subject = 'Reminder'; GO

Administracin de Base de Datos I

117

Ejemplo 4: En el ejemplo siguiente se crea un disparador para asegurarse de que la calificacin 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 calificacin de crdito del Proveedor, deber hacer referencia. Si la calificacin de crdito del proveedor es muy bajo, se muestra un mensaje y la insercin 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 calificacin 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

Administracin de Base de Datos I

118

Ejemplo 5: El cdigo siguiente muestra la creacin 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;

Administracin de Base de Datos I

119

Administracin de Base de Datos I

120

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

Administracin de Base de Datos I

121

Cules son los tipos de datos suministrados por el sistema?


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

Administracin de Base de Datos I

122

Das könnte Ihnen auch gefallen