Manual Transact SQL PDF
Manual Transact SQL PDF
A
TRANSACT SQL
Dto Programacin
Merlos-Infor, SL
Manual de Transact SQL 2009
Actualmente, est en marcha un proceso de revisin del lenguaje por parte de los
comits ANSI e ISO, que debera terminar en la definicin de lo que en este momento
se conoce como SQL3. Las caractersticas principales de esta nueva encarnacin de
SQL deberan ser su transformacin en un lenguaje stand-alone (mientras ahora se
usa como lenguaje hospedado en otros lenguajes) y la introduccin de nuevos tipos de
datos ms complejos que permitan, por ejemplo, el tratamiento de datos
multimediales.
Las desventajas de SQL son pocas comparadas a las ventajas, y van ms por el lado
comercial y por lo complejo que puede ser el acceso a los comandos desde la consola.
SQL es la herramienta ideal para trabajar con bases de datos, pero para poder realizar
una aplicacin completa para el manejo de una base de datos relacional, necesitamos
usar alguna herramienta que soporte la capacidad de consulta del SQL y la
versatilidad de los lenguajes de programacin tradicionales.
Transact SQL nos aporta esta necesidad y con Transact SQL vamos a poder
programar las unidades de programa de la base de datos SQL Server, como
procedimientos almacenados, funciones, triggers o scripst.
/*
Este es un comentario con varias lneas.
Conjunto de Lineas.
El saber que palabra es igual a otra, o cual va antes que otra (alfabticamente) puede
parecer una cosa sin importancia y bastante trivial, en nuestro caso puede ser, pero en
el resto de los idiomas no es as. Por ejemplo el Japons emplea tres alfabetos
diferentes, y tiene unas reglas bastante complejas para determinar que carcter va
antes y cual despus. Es ms, en castellano existen diferentes criterios para ordenar
como puede ser que la combinacin de letras ch se coloque despus de la letra c.
La intercalacin puede definirse a diferentes niveles segn nos interese en cada caso.
Puede definirse a nivel de servidor de BD, a nivel de la BD, a nivel de tabla, a nivel del
SQL Server dispone de varios tipos de datos nmericos. Cuanto mayor sea el nmero
que puedan almacenar mayor ser en consecuencia el espacio utilizado para
almacenarlo. Como regla general se recomienda usar el tipo de dato mnimo posible.
Todos los datos numricos admiten el valor NULL.
1. Bit. Una columna o variable de tipo bit puede almacenar el rango de valores de
1 a 0.
2. Tinyint. Una columna o variable de tipo tinyint puede almacenar el rango de
valores de 0 a 255.
3. SmallInt. Una columna o variable de tipo smallint puede almacenar el rango de
valores -32768 a 32767.
4. Int. Una columna o variable de tipo int puede almacenar el rango de valores de
-231 a 231-1 .
5. BigInt. Una columna o variable de tipo bigint puede almacenar el rango de
valores -263 a 263-1 .
6. Decimal(n,d). Una columna de tipo decimal puede almacenar datos nmericos
decimales sin redondear. Donde n es la precision (nmero total del dgitos) y d
el nmero de valores decimales.
7. Float. Una columna de datos float puede almacenar un rango de valores de
-1,79X-10308 a 1,79X-10308, si la definimos con el valor mxmo de precisin. La
precisin puede variar entre 1 y 53.
8. Real. Sinnimo de float(24). Puede almacenar el rango de valores -3,4X-1038 a
3,4X-1038.
9. Money. Almacena valores nmericos monetarios de -263 a 263-1, con una
precisin de hasta diez milesimas de la unidad monetaria.
10. SmallMoney. Almacena valores nmericos monetarios de -214.748,3647 a
214.748,3647, con una precisin de hasta diez milesimas de la unidad
monetaria.
Todos los tipos de datos enteros pueden marcarse con la propiedad identity para
hacerlos autonumricos.
Como avanzadilla sobre los que nos vendr, en SQL SERVER 2008, aparece el
tipo DATE, que a diferencia de DATETIME que ocupa 4 bits, el DATE ocupar 3, y
slo guardar la fecha.
En Eurowin, sobre la versin 2008, los campos de tipo fecha son traducidos al tipo
DATE. Con esto se consiguen las siguientes ventajas:
- Rango totalmente ampliado (1/1/0001 31/12/9999). Evitamos el problema del
2005 por fuera de rango
- Binary. Se utiliza para almacenar datos binarios de longitud fija, con una
longitud mxima de 8000 bytes.
- Varbinary. Se utiliza para almacenar datos binarios de longitud variable, con
una longitud mxima de 8000 bytes..Es muy similar a binary, salvo que
varbinary utiliza menos espacio en disco.
- Varbinary(max).Igual que varbinary, pero puede almacenar 231-1 bytes
El siguiente ejemplo muestra como asignar una variable utilizando la instruccin SET.
DECLARE @nombre VARCHAR(100)
-- La consulta debe devolver un nico registro
SET @nombre = (SELECT nombre
FROM CLIENTES
WHERE codigo =43000124 )
PRINT @nombre
PRINT @nombre
PRINT @direccion
PRINT @poblacion
PRINT @nombre
PRINT @direccion
PRINT @poblacion
OPEN CurClientes
FETCH CurClientes INTO @nombre, @direccion, @poblacion
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @nombre
PRINT @direccion
PRINT @poblacion
FETCH CurClientes INTO @nombre, @direccion, @poblacion
END
CLOSE CurClientes
DEALLOCATE CurClientes
Operador de +
concatenacin
Otros ALL (Devuelve TRUE si el conjunto completo de
comparaciones es TRUE)
ANY(Devuelve TRUE si cualquier elemento del conjunto
de comparaciones es TRUE)
BETWEEN (Devuelve TRUE si el operando est dentro
del intervalo)
EXISTS (TRUE si una subconsulta contiene filas)
IN (TRUE si el operando est en la lista)
LIKE (TRUE si el operando coincide con un patron)
NOT (Invierte el valor de cualquier operador booleano)
SOME(Devuelve TRUE si alguna de las comparaciones
de un conjunto es TRUE)
IF (<expresion>)
IF @diminutivo = 'EW'
BEGIN
PRINT 'www.eurowin.com'
END
ELSE
BEGIN
PRINT 'Otro software '
END
ELSE
BEGIN
INSERT INTO PAISES
(CODIGO , NOMBRE) VALUES
(@codPais, @nomPais)
END
CASE <expresion>
WHEN <valor_expresion> THEN <valor_devuelto>
WHEN <valor_expresion> THEN <valor_devuelto>
ELSE <valor_devuelto> -- Valor por defecto
Ejemplo de CASE.
Bucle WHILE
WHILE <expresion>
BEGIN
...
END
Estructura GOTO
La sentencia GOTO nos permite desviar el flujo de ejecucin hacia una etiqueta.
IF @@ERROR > 0
GOTO error
El siguiente ejemplo muestra una consulta sencilla que obtiene el cdigo y el nomnbre
de la "familia" de una tabla llamada familias (representara familias de productos por
ejemplo).
El uso del asterisco indica que queremos que la consulta devuelva todos los campos
que existen en la tabla.
Ahora vamos a realizar una consulta obteniendo adems de los datos de familias, las
subfamilias asociadas a las familias y los productos.
SELECT *
FROM [2008V8].[dbo].FAMILIAS
INNER JOIN [2008V8].[dbo].SUBFAM
ON SUBFAM.FAMILIA = FAMILIA.CODIGO
INNER JOIN [2008V8].[dbo].ARTICULO
ON ARTICULO.FAMILIA = FAMILIA.CODIGO
Si queremos realizar la consulta para que no sea exclusiva, tenemos que utilizar LEFT
JOIN.
SELECT *
FROM [2008V8].[dbo].FAMILIAS
LEFT JOIN [2008V8].[dbo].SUBFAM
ON SUBFAM.FAMILIA = FAMILIA.CODIGO
LEFT JOIN [2008V8].[dbo].ARTICULO
ON ARTICULO.FAMILIA = FAMILIA.CODIGO
Los registros que no tengan datos relacionados en una consulta LEFT JOIN
devolvern en valor NULL en los campos que correspondan a las tablas en las que no
tienen dato.
Tambin podemos forzar un producto cartesiano (todos con todos) a travs de CROSS
JOIN o FULL JOIN (a partir de SQL 2000)
SELECT *
FROM [2008V8].[dbo].FAMILIAS
FULL JOIN [2008V8].[dbo].SUBFAM
La clusula WHERE
SELECT *
FROM [2008V8].[dbo].FAMILIAS
WHERE CODIGO IN ('001','002')
La clausula WHERE se puede utilizar conjuntamente con INNER JOIN, LEFT JOIN ...
WHERE CODIGO='001'
_ representa un caracter.
La clausula TOP se puede combinar con WITH TIES en consultas agregadas. Este
punto lo veremos propiamente en las consultas agregadas.
La clusula ORDER BY
La clusula GROUP BY
La clausula GROUP BY combina los registros devueltos por una consulta SELECT
obteniendo uno o varios valores agregados(suma, valor mnimo y mximo ...).
Para cada registro se puede crear un valor agregado si se incluye una funcin SQL
agregada, como por ejemplo Sum o Count, en la instruccin SELECT. Su sintaxis es:
El siguiente ejemplo realiza una "cuenta" de los datos que hay en la tabla ARTICULOS
En este otro se muestra la suma del IMPORTE de cada uno de los productos que
componen un pedido, para calcular el total del pedido agrupado por el numero de
pedido.
Sql Server nos obliga a que en la agrupacin aparezcan todos los campos no
agrupados que hay en la consulta.
Siempre que incluyamos una clausula WHERE en una consulta agregada esta se
aplica antes de calcular el valor agregado. Es decir, si sumamos el valor de las ventas
por producto, la suma se calcula despus de haber aplicado el filtro impuesto por la
clausula WHERE.
La clusula HAVING
Es posible que necesitemos calcular un agregado, pero que no necesitemos obtener
todos los datos, solo los que cumplan una condicin del agregado. Por ejemplo,
podemos calcular el valor de las ventas por producto, pero que solo queramos ver los
datos de los pedidos que el importe sea mayor de 150. En estos casos se debe usar la
clausula HAVING.
Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier
registro agrupado por la clusula GROUP BY que satisfaga las condiciones de la
clusula HAVING. Se utiliza la clusula WHERE para excluir aquellas filas que no
desea agrupar, y la clusula HAVING para filtrar los registros una vez agrupados.
Funciones agregadas.
Transact SQL pone a nuestra disposicin mltiples funciones agregadas, las ms
comunes usaremos son:
Count
Calcula el nmero de registros devueltos por una consulta. Su sintaxis es la siguiente:
COUNT(<expr>)
En donde expr contiene el nombre del campo que desea contar. Los operandos de
expr pueden incluir el nombre de un campo de una tabla, una constante o una funcin
(la cual puede ser intrnseca o definida por el usuario pero no otras de las funciones
agregadas de SQL). Puede contar cualquier tipo de datos incluso texto.
Count simplemente cuenta el nmero de registros sin tener en cuenta qu valores se
almacenan en los registros. La funcin Count no cuenta los registros que tienen
campos null a menos que expr sea el carcter comodn asterisco (*).
Max, Min
MIN(<expr>)
MAX(<expr>)
Sum
SUM(<expr>)
En donde expr respresenta el nombre del campo que contiene los datos que desean
sumarse o una expresin que realiza un clculo utilizando los datos de dichos campos.
Podemos utilizar SELECT TOP con consultas agregadas como con cualquier otra
instruccion Transact SQL.
En estos casos, la clausula TOP se aplica despus de calcular el agregado,
devolviendo las N filas indicadas.
Sin embargo, puede darse el caso, en consultas de rankings u otros clculos, que la
fila N+1 agregado idntico al de la fila N. El uso de TOP N discriminara el registro
N+1. Para evitar este comportamiento, y que la consulta devuelva tambin el registro
N+1utilizamos la clausula WITH TIES.
UNION
El siguente ejemplo, en el campo direccin del resultado nos rellenar el campo CIF
en los resultados correspondientes a PROVEED
El siguente ejemplo, devolver un error, dado que als consultas con UNION el numero
de campos a consultar en cada tabla debe de ser el mismo.
Cuando realizamos una consulta con UNION internamente se realiza una operacion
DISTINCT sobre el conjunto de resultados final. Si queremos obtener todos los valores
debemos utiliza UNION ALL.
EXCEPT
Este ejemplo devolver la consulta de la tabla de CUENTAS sin las cuentas que se
encuentren en la tabla CLIENTES
INTERSECT
En SQL Sever podemos marcar un campo de una tabla como autonumrico (identity),
cuando insertamos un registro en dicha tabla el valor del campo se genera
automticamente. Para recuperar el valor generado disponemos de varios mtodos:
USE test
GO
CREATE TABLE Tabla1 ( id int IDENTITY(1,1)PRIMARY KEY,
Nombre varchar(20) NOT NULL);
Clausula OUTPUT
Las columnas con prefijo DELETED reflejan el valor antes de que se complete la
instruccin UPDATE o DELETE. Es decir, son una copia de los datos "antes" del
cambio.
Las columnas con prefijo INSERTED reflejan el valor despus de que se complete la
instruccin UPDATE o INSERT, pero antes de que se ejecuten los desencadenadores.
Es decir, son una copia de los datos "despues" del cambio.
GO
UPDATE <nombre_tabla>
SET <campo1> = <valor1>
{[,<campo2> = <valor2>,...,<campoN> = <valorN>]}
[ WHERE <condicion>];
UPDATE CLIENTES
SET
NOMBRE = 'JIMENES LOSANTOS, FEDERICO'
WHERE CLIENTE = '43000010'
Un aspecto a tener en cuenta, es que SQL graba los cambios inmediatamente sin
necesidad de hacer COMMIT. Por supuesto podemos gestionar nosotros las
transacciones pero es algo que hay que hacer de forma explcita con la instruccin
BEGIN TRAN y que se ver en un curso ms avanzado de T-SQL.
Update INNER JOIN
UPDATE D_ALBVEN
SET
FAMILIA=ARTICULO.FAMILIA
FROM D_ALBVEN
INNER JOIN ARTICULO
ON ARTICULO.CODIGO=D_ALBVEN.ARTICULO
UPDATE D_ALBVEN
SET
FAMILIA= B.FAMILIA
FROM D_ALBVEN A, ARTICULO B
WHERE B.CODIGO = A.ARTICULO
Clausula OUTPUT
UPDATE ACTIVI
SET
NOMBRE='INSTALADOR DE GAS'
OUTPUT DELETED. * INTO @FILAS_ACTUALIZADAS
WHERE CODIGO='56'
GO
Cast y Convert
Donde:
data_type, es el tipo de destino al que queremos convertir la expresion
expresion, la expresion que queremos convertir
SELECT @fecha
SELECT @fechaFormateada
nos da como resultado: 01/10/09
SELECT @fechaFormateada
Donde:
expresion, la expresion que queremos convertir
data_type, es el tipo de destino al que queremos convertir la expresin, por
ejemplo un numrico a carcter o un carcter a numrico.
SELECT @dato2
Para obtener ms informacin sobre las tablas de conversin o los cdigos de stilo
podemor ir al siguiente enlace:
Isnull
Evalua una expresion y si esta es NULL, reemplaza NULL con el valor de reemplazo
especificado. El valor de reemplazo debe ser del mismo tipo de datos que la expresion
a evaluar.
ISNULL ( expresin , valor_de_reemplazo )
Veamos un ejemplo.
GetDate y GetUTCDate
GetDate devuelve la fecha y hora actuales del sistema en el formato interno estndar
de SQL Server 2005 para los valores datetime.
GetUTCDate devuelve el valor datetime que representa la hora UTC (hora universal
coordinada u hora del meridiano de Greenwich) actual.
Veamos un elemplo
Nos devuelve:
2009-10-05 12:53:14.263 2009-10-05 10:53:14.263
Datepart
Sinedo :
Veamos un ejemplo:
Nos devolver:
Trimestre dia_del_ao semana
4 278 41
EXECUTE o EXEC:
La sintaxis es la siguiente
Argumentos :
@ string_variable
Es el nombre de una variable local. @string_variable puede ser cualquier tipo de datos
char, varchar, nchar o nvarchar.
Ejemplo:
DECLARE @SentenciaSql varchar(max), @BBDD varchar(10)
set @BBDD='2009Wb'
set @sentenciaSql='SELECT * FROM ['+@BBDD+'].[dbo].articulo'
EXEC(@SentenciaSql)
[N] 'tsql_string'
Es una cadena de constante. tsql_string puede ser del tipo de datos nvarchar o
varchar. Si se incluye N, la cadena se interpreta como del tipo de datos nvarchar.
Ejemplo:
EXEC( 'SELECT * FROM [2009WB].[dbo].articulo')
Pivot
Pivot gira, por decirlo de alguna manera, los resultados verticales de una tabla en
resultados horizontales, realizando las agregaciones (sum, avg, etc..) que sean
necesrias para obtener los resultados.
ROLLUP:
El operador ROLLUP es til para generar informes con subtotales y totales de forma
automtica. Nos presenta los totales agrupados por los campos del group by.
CUBE:
El operador CUBE es til para generar un conjunto de resultados que es un cubo
multidimensional.
Ahora podemos ejecutar las dos consultas juntas, de forma que analizaremos los
resultados:
Un cursor es una variable que nos permite recorrer con un conjunto de resultados
obtenido a travs de una sentencia SELECT fila a fila.
Cuando trabajemos con cursores debemos seguir los siguientes pasos.
Declarar el cursor, utilizando DECLARE
Abrir el cursor, utilizando OPEN
Leer los datos del cursor, utilizando FETCH ... INTO
Cerrar el cursor, utilizando CLOSE
Liberar el cursor, utilizando DEALLOCATE
La sintaxis general para trabajar con un cursor es la siguiente.
WHILE (@@FETCH_STATUS = 0)
BEGIN
Cierra el cursor
CLOSE <nombre_cursor>
use [master]
go
declare @nombreBBDD nvarchar(128), @sentenciaSQL nvarchar(max)
OPEN cursorBBDD
FETCH NEXT FROM cursorBBDD
INTO @nombreBBDD
WHILE @@FETCH_STATUS = 0
BEGIN
LOCAL: Especifica que el mbito del cursor es local para el proceso por lotes,
procedimiento almacenado o desencadenador en que se cre el cursor.
GLOBAL: Especifica que el mbito del cursor es global para la conexin. Puede
hacerse referencia al nombre del cursor en cualquier procedimiento almacenado o
proceso por lotes que se ejecute en la conexin.
STATIC: Define un cursor que hace una copia temporal de los datos que va a utilizar.
Todas las solicitudes que se realizan al cursor se responden desde esta tabla temporal
de tempdb; por tanto, las modificaciones realizadas en las tablas base no se reflejan
en los datos devueltos por las operaciones de recuperacin realizadas en el cursor y
adems este cursor no admite modificaciones.
KEYSET: Especifica que la pertenencia y el orden de las filas del cursor se fijan
cuando se abre el cursor. El conjunto de claves que identifica las filas de forma nica
est integrado en la tabla denominada keyset de tempdb.
Anexos:
TRUCOS Y CURIOSIDADES:
SELECT @expresion
Esto puede ser muy til si hemos de borra un archivo del disco duro desde la consola
del MSSMS, o ejecutar un comando de consola de DOS, como por ejemplo el BCP.
Podemos ejecutar trazas (profiles) en el servidor de SQL Server para visualizar todas
las llamadas que se ejecutan sobre la Base de Datos.
- Otro dellate para estudiar son las lecturas y escrituras. Las trazas permiten
visualizar los accesos que tenemos en disco fsico (lecturas u escrituras). Si
tenemos altas lecturas u escrituras podemos optimizar las consultas o aadir
ndices en las tablas donde participa.
- Y por finalizar, dira que gracias a las trazas nos permiten realizar un pequeo
debug. Si estamos programando aplicaciones que trabajan con storeds
puede sernos til lanzar una traza, recoger la llamada del stored con todos sus
parmetros y ejecutar la consulta en el Query analyzer.
USE [2009WB];
SELECT TABLE_NAME,*
COALESCE