Transact SQL Server
Transact SQL Server
Sesión 09
EL TRANSACT-SQL
Objetivos
• Describir y utilizar el SQL Server Managment Studio
• Describir los elementos básicos del Transact-SQL.
• Escribir ordenes SELECT básicas y algunas funciones de sistema
• Describir los modos de ejecutar ordenes Transact-SQL
Management Studio
Formas de Acceso:
• Desde el Explorador de Objetos: Clic derecho sobre la BD deseada: Nueva consulta (New
Query)
Ejemplos. Al digitar cada orden, pulsar F5 y estando Tenebrosa como base de datos activa:
a. SELECT @@version
b. SELECT * FROM cliente
c. sp_help cliente
Por defecto sólo los miembros de los Roles SysAdmin, db_creator, db_owner o
db_ddladmin pueden ejecutar este tipo de órdenes.
Nombrando Objetos:
Identificadores Estándar:
• La primera letra debe ser un carácter alfabético
• La sgte puede ser un carácter, número o los símbolos: @, #, _
Identificadores delimitados:
• Cuando el nombre incluye un espacion en blanco
• Cuando se usan palabras reservadas para nombrar los objetos
• Utilizar corchetes [] ó apóstrofes "
• Ejemplos:
Servidor.BaseDatos.Owner.Objeto
SqlServer1.Tenebrosa.dbo.Cliente
Observe que owner ha sido reemplazado por dbo, para ello los objetos de la BD deben
ser creados por los que tengan rol de SystemAdministrator o con el usuario sa. Si el
objeto pertenece a un Schema, incluir el nombre del schema en lugar de dbo (recuerde
que dbo es el esquema por defecto)
Servidor.basedatos.owner. objeto
Servidor. basedatos..objeto
Servidor..owner.objeto
Servidor...objeto
basedatos.owner.objeto
basedatos..objeto owner.objeto
objeto
Por defecto, sólo los miembros del Rol: SysAdministrator, db_owner, db_datawriter o
db_datareader pueden ejecutar alguno de estos comandos.
Ejemplos:
a. SELECT tipodoc, documento, fecha, observacion
FROM documento
Variables
• Variables Locales
Definidas por el usuario son de la sgte forma:
DECLARE @variable_local <tipo_dato> [<long>]
USE TENEBROSA
DECLARE @tasaigv numeric(9,2) -- Declarando la variable local
SET @tasaigv = 18.0 -- Asignando Valor directamente
Otra forma de asignar directamente desde una orden SELECT
DECLARE @tasaigv numeric(9,2)
SELECT @tasaigv = tasaigv FROM parametro WHERE activo = 1
• Variables globales
Propias del SQL Server
No se les puede asignar ningún valor, sólo pueden ser leídas.
Inician con el símbolo: @@
Ejemplos:
PRINT @NroRegistros
Importante! Cuando las variables son declaradas no tienen ningún valor o sea
son NULL (nulas)
Operadores
Tipo de Operadores
Asignación (=)
Funciones de Sistema:
Son funciones proporcionadas por el Transact-SQL, normalmente utilizan parámetros para
devolver valores.
Son de 3 tipos:
Funciones de Agregamiento
Evalúan una serie de valores y retornan un valor simple sumarizado. Las revisaremos con más
detalle en el capítulo de sumarización de datos.
Ejemplo:
a. Imaginemos que queremos conocer el importe al que asciende la factura número
100000017
Funciones escalares
Operan un simple valor y retornan un simple valor. Pueden ser agrupadas dentro de las
siguientes categorías
Frecuencia Abreviatura
Año yy
Trimestre qq
Mes mm
Día del año dy
Día dd, d
Semanda ww
Día de semana dw
Hora hh
Minuto mi
Segundo ss
Milisegundo ms
Ejemplo: imagine que desea conocer los pedidos ocurridos en Julio del año 2000
SELECT pedido, cliente, fecha
FROM pedido WHERE DATEPART(yy, fecha) = 2000 AND
DATEPART(mm, fecha) = 7
Sintaxis:
DATEDIFF(<frecuencia>, <fecha_referencia>, <fecha_comparativa>)
Donde:
<frecuencia> : equivale a los valores de la tabla anterior
<fecha_referencia> : es la fecha desde la cual se quiere medir el tiempo transcurrido.
<fecha_comparativa>: es la fecha final sobre la cual se desea conocer cuantos días
han transcurrido desde la <fecha_referencia>
Ejemplo: imagine que desea conocer los días transcurridos desde la emisión del
documento con respecto a la fecha de hoy.
Sintaxis:
DATEADD(<frecuencia>, <incremento>, <fecha_referencia>)
Donde:
<frecuencia> : equivale a los valores de la tabla anterior de DATEPART
<incremento> : es la cantidad a ser agregada a la <fecha_referencia>
<fecha_referencia> : es la fecha sobre la cual se produce el incremento
El formato sólo es aplicado a las expresiones tipo Datetime y el valor de formato a ingresar se
resume en la sgte tabla:
Ejemplo:
a. Imagine que desea mostrar el codigo del producto, su descripción y el precio de
vent a acompañado del m ensaje: "Precio es"
Nótese que para poder concatenar las expresiones debe ser tipo cadena, en el caso de
PrecVenta es numérico, por lo que se ha incluido la función CONVERT()
b. Suponga que desea conocer los documentos emitidos el día , dos de Julio del
año 2000. El formato de la fecha dependerá del idioma de instalación, vamos a
suponer que la instalación es en Español (dd/mm/yyyy).
c. Como puede observar los datos obtenidos para la fecha ingresada corresponden
a las 00:00:00 de ese día.
Se agrupan en 2 tipos:
Nivel de Orden
BEGIN... END
Si alguno de los elementos de control, que veremos a continuación, incluyen una serie
de órdenes Transact-SQL es necesario que estén delimitadas por BEGIN.. END
BEGIN
<órdenes SQL>
END
WHILE
Establece una condición que mientras se es cumplida permitirá la ejecución del bloque de
instrucciones. Puede ser controlada mediante BREAK: lo cual finaliza la ejecución del bloque y
CONTINUE que reinicia la ejecución del bloque.
Syntax
WHILE Expresión Condicional
BEGIN
[ BREAK ] [
CONTINUE ]
END
IF...ELSE:
Permite evaluar una condición si es verdadera se ejecuta el bloque de órdenes. Opcionalmente
se puede incluir ELSE para ejecutar órdenes en caso la condición sea Falsa
IF <condición>
Comentarios:
Sirven para documentar un Script
Existen 2 formas
Nivel de Registro
CASE
Permite evaluar una lista de condiciones y retorna el valor de la condición verdadera.
CASE <valor_a_evaluar>
WHEN <expression_condición> THEN <Resultados> [
...n ]
[
ELSE <resultado_tomado_sino_cumplen_condiciones_aanteriores>
]
END
Usando Batches
Definición
Un batch es un conjunto de órdenes Transact-SQL que pueden ser incluídas en SQL
Server y ejecutadas como un grupo. Pueden formar parte de un Script. Un script
puede incluir uno o más Batches.
Delimitador
El delimitador de finalización de un Batch es la orden GO
Ejemplos de Batches
a. CREATE DATABASE
CREATE TABLE
GO
CREATE VIEW1
GO
CREATE PROCEDURE...
b. CREATE DATABASE
CREATE TABLE
CREATE TRIGGER
CREATE TRIGGER
Habría un error!
c. CREATE DATABASE
CREATE TABLE
GO
CREATE TRIGGER
GO
CREATE TRIGGER
Usando Scripts
Definición
Constituye una de las formas más comunes para ejecutar órdenes Transact-SQL. Un Script es
una o más órdenes Transact-SQL que son almacenadas como un archivo.
Se reconocen porque tienen la extensión .SQL y pueden ser ejecutados las veces que sea
necesario.
Paso Descripción
Parse Cheque sintáxis
Resol ve Valida los nombres de los objetos y los permisos
Optimiza Determina los índices usados y la estrategia de los JOINs
Compila Traslada la consulta dentro de una forma ejecutable
Execute Procesa requerimiento
Definición
Una orden dinámica es construída mientras otro script es ejecutado. Las cadenas literales son
concatenadas con los valores de una o más variables, el resultado de la cadena es una orden
Transact-SQL.
Ejecución
Se tienen las sgts. posibilidades
• Usar el stored procedure: sp_executesql
SP_EXECUTESQL [@orden_sql=]
• EXECUTE y la serie concatenada
EXECUTE (@orden_sql)
Sesión 10
RECUPERANDO DATOS
La orden SELECT
Filtrando Datos
Objetivos
1. Se quiere conocer a todo los clientes cuyo nombre empieza con RODRIGUEZ.
4. Identificar todos los vendedores cuyo sueldo básico sea superior a 400 y se
encuentren activos.
5. Se necesita conocer los pedidos efectuados por el cliente con código CL10
emitidas en Enero, Junio y Diciembre.
6. Se desea tener una calificación del detalle de ventas (detadoc) en función a la tabla
siguiente
8. Se desea conocer los montos vendidos (detadoc) del producto PR01 con montos superiores
(Cantidad *precunit) entre 2000 y 10000.
Sesión 11
Objetivos
Sintáxis:
SELECT {nombre campo} [, ...n] FROM
{tabla_o_vista}
[
[ INNER | {{LEFT | RIGHT | FULL} [OUTER] }]
JOIN
tabla o vista ON condiciones de búsqueda]
] [-n] ~
[ WHERE condiciones_de_búsqueda ] ORDER BY
{nombre campo} [, ...n] }
Performance
Cuando use JOIN en más de dos tablas, y si estas son largas -con una cantidad considerable
de registros-, debería de analizar las consultas utilizando el Plan de Ejecución o las ordenes SET
SHOWPLAN_TEXT, SET_SHOWPLAN_ALL estudiadas en el manejo de índices. Tener presente el
manejo de índices como una forma de mejorar la performance de las consultas.
USE Tenebrosa
SELECT documento, tipodoc, nombre, cliente.cliente, personal
FROM documento INNER JOIN cliente
ON documento.cliente = cliente.cliente
USE Tenebrosa
SELECT d.documento, d.tipodoc, c.nombre, c.cliente, d.personal
FROM documento d INNER JOIN cliente c
ON d.cliente = c.cliente
El alias es el uso alternativo de un “nombre” que representa a la tabla. Una vez definido el sistema
solo reconocerá al alias especificado en cualquier punto de la orden SQL respectiva.
En el caso expuesto existe una relación directa entre: CLIENTE y DOCUMENTO . Esto puede verlo
con el diagramador, una vez ubicadas las tablas, siga los pasos indicados a continuación:
Si no existiera relación lo fundamental es que existan columnas con datos comunes en ambas
tablas tal como se puede apreciar a continuación con las columnas cliente en las tablas: CLIENTE
y DOCUMENTO
Note que la palabra JOIN es vital para el enlace de las 2 tablas. INNER es una forma de unión
que exige que los datos comunes existan en las tablas unir. En términos del ejemplo con
INNER solo aparecerán los clientes que hayan comprado, o sea que existan en DOUMENTO.
Finalmente tenemos:
Como se observó con INNER JOIN la información que brinda es de todos los datos de
cliente que existe en ambas tablas.
Como saber si debo aplicar LEFT o RIGHT, esto dependerá de la ubicación de la tabla
que se desea obtener el 100% respecto a la palabra JOIN. Por ejemplo en el caso de que
se quieran todos los clientes
El resultado es:
Finalmente tenemos:
Note que: CLI3 y CLI7 no tienen presencia en DOCUMENTO por lo que el sistema
devuelve NULL.
Podemos obtener utilidad con LEFT o RIGHT cuando por ejemplo necesitemos conocer
los clientes que no nos han comprado, tendríamos que especificar cualquier columna de
documento como NULL, la orden quedaría
Objetivos
• Cumplir requerimientos utilizando la orden SELECT incluyendo JOINS
Lista de Requerimientos
4. Se pretende realizar una depuración de los productos que no han tenido ni una
sola venta en lo que va desde el inicio de las operaciones de la empresa.
Muestre estos productos.
5. Se desea conocer los pagos efectuados a partir del año 2000, mostrando el
nro de pago, el nro del documento, su tipo, el importe pagado, el nombre del
cliente y la fecha en que se produjo el pago.
Sesión 12
SUMARIZANDO DATOS
Objetivos
Función Descripción
AVG Promedio
COUNT Contar valores de una expresión
COUNT (*) Número de registros
MAX Máximo valor de la expresión
MIN Mínimo valor de la expresión
SUM Acumula valores de una
STDEV Desviación estándar
STDEVP Desviación estádar de toda la
VAR Varianza
VARP Varianza estadística de todos los
Sintáxis:
SELECT {{AVG | COUNT | MAX | MIN | SUM
| STDEV | STDEVP | VAR | VARP} (expression | *) } [, . . . n] FROM tabla
[ WHERE condiciones_de_búsqueda ]
[ GROUP BY [ALL] lista_de_campos ]
[ HAVING condioion de grupo ]
Objetivos
Lista de Requerimientos
Sesión 14
MODIFICANDO DATOS
Objetivos
Ejemplos
INSERT linea (linea, descripcion)
VALUES ('TU', 'GASES')
--select * from linea
-- 2-- error PK
INSERT linea (linea, descripcion) VALUES ('TU', 'GASES')
-- 3 - NO CORREr FALTAN COLUMAS
INSERT linea (linea) VALUES ('TX', 'BEBIDAS')
-- 4 - OK
INSERT linea (linea) VALUES ('TX')
-- 5 --> ERROR FK (LINEA)
SELECT * FROM LINEA
INSERT marca (marca, proveedor, linea, descripcion)
VALUES ('X1', 'PV01', 'KR', 'PRIMAVERA')
-- 6 --> OK
INSERT marca (marca, proveedor, linea, descripcion)
VALUES ('X1', 'PV01', 'L2', 'PRIMAVERA')
DELETE:
eliminar registros de información a las tablas
Registros en una tabla por vez
Se activan las reglas de integridad de datos
Sintaxis:
Ejemplos
UPDATE:
modificar registros de información a las tablas
Registros en una tabla por vez
Se activan las reglas de integridad de datos
Sintaxis:
Ejemplos
Sesión 16
MANEJO DE TRIGGERS
Constituyen una forma avanzada de Integridad de Datos ya que permite asegurar que
las reglas de negocio se plasmen automáticamente cuando se ejecuta un cambio en la
BD. Por ejemplo cada vez que se realiza un ingreso de productos al almacén
automáticamente debe de actualizarse el stock del producto.
Objetivos
Qué es un Trigger ?
Un Trigger es un tipo especial de Stored Procedure que se ejecuta automáticamente
cundo se pretende realizar un cambio a una tabla de la BD, es decir cuando se aplica:
UPDATE, DELETE, INSERT.
Características
• Van asociados a una Tabla
• Son invocados automáticamente
• No pueden ser llamados directamente
• Constituyen una transacción
Usos de un Trigger
• Modificaciones en cascada para tablas relacionadas (Padre-Hijo); por ejemplo:
Docum y LineaDocum
• Forzar la complejidad de la Integridad de Datos
• Personalizar mensajes de error
• Comparar el estado de un registro antes o después de un cambio
Creando Triggers
Se utilizar la orden CREATE TRIGGER. Para lo cual es necesario tener los permisos
respectivos
[WITH APPEND]
UPDATE producto
SET stockac = stockac + inserted.cantidad
FROM lineadocum l INNER JOIN inserted
ON l.nrodoc = inserted.nrodoc AND l.idproducto = inserted.producto
sobre la cual podemos hacer mención en cualquiera de sus campos a fin de disparar
Ms, Ing. Ricardo Mendoza Rivera Page 48
MS SQL Server - Transact SQL
alguna acción en otras tablas si deseamos.
UPDATE producto
SET stockac = stockac - deleted.cantidad
FROM lineadocum l INNER JOIN deleted
ON l.nrodoc = inserted.nrodoc AND l.idproducto = inserted.producto
UPDATE producto
SET stockac = stockac - deleted.cantidad + inserted.cantidad
FROM lineadocum l INNER JOIN deleted
ON l.nrodoc = inserted.nrodoc AND l.idproducto = inserted.producto
Ejercicio
• Crear los trigger respectivos para actualizar el saldo de un cliente cada vez que
éste realiza una compra al crédito o paga un documento.
• Crear un trigger para actualizar las compras efectuadas.
Objetivos
• Preparar triggers para actualiza el Stock del producto y el Saldo de cliente para una
venta al crédito
FOR INSERT
AS
-- Capturando variables
-- Actualizando el stock
UPDATE producto
IF @fp o 'C
FOR DELETE
AS
-- Capturando variables
-- Actualizando el stock
UPDATE producto
@fp o 'C
Sesión 17
Objetivos
Definición
Es una colección de ordenes Transact-SQL que van orientados a incrementar la
performance de las tareas repetitivas. Por ejemplo si desea realizar un cálculo de
planillas o realizar un proceso de facturación en Batch. Es recomendable usarlos
cuando desde el cliente se van a ejecutar más de una instrucción SQL. Tienen la
capacidad de aceptar parámetros y de retornar valores . Por ejemplo imagine el
cálculo de planillas teniendo una interfaz desde la aplicación tal como se muestra en el
siguiente diagrama:
Tipos
Existen 5 tipos
• System
• Local
• Temporary
• Re mote
• Extended
System SP
System SP son almacenados en la Base de Datos Master y llevan típicamente el
Ms, Ing. Ricardo Mendoza Rivera Page 53
MS SQL Server - Transact SQL
prefijo sp_, pueden invocar el llamado de datos de las tablas del sistema, ejecutar
tareas administrativas y tareas de seguridad.
Por ejemplo, si desea conocer la información del catálogo de la tabla de cliente
puede ejecutar sp_help de la siguiente manera:
Sp_help cliente
Local SP
Son comúnmente los más usados y corresponden a los Stored Procedures que vamos
creando en nuestros servidores locales.
Ventajas de las SP
Incrementan la Performance:
Dado que los procesos se realizan en el servidor los tiempos de ejecución tienden a
ser mejores.
Sixtáxis:
CREATE PROCEDURE <Nombre Stored ProO [
AS
<ordenes_SQL>
Por ejemplo: vamos a suponer que queremos conocer los clientes que nos
adeudan 2 documentos pendientes de pago:
Parámetros de Entrada
Son aquellos que reciben los valores mandados desde la aplicación, pueden incluirse
valores por defecto los mismos que entrarían a trabajar en el caso no hayan definido
al momento de su llamado. En el caso de que hayan sido definidos como cadena,
tomarán la longitud del parámetro en el SP.
--observe OUTPUT
Resultado = 35
Pasos
• Declarar el cursor
• Abrir el cursor
• Procesar el cursor
WHILE
@@fetch_s
tatus = 0
BEGIN
— <procesar el cursor>
FETCH Nombre_Cursor INTO <lista_variab_memoria> --
leer, avanzar END
• Cerrar el cursor
CLOSE Nombre Cursor
• Desactivarlo de memoria
DEALLOCATE Nombre Cursor
Por Ejemplo:
• Combinar la potencialidad de programación del lado del servidor que ofrece SQL
Server.
El presente ejemplo supone una venta realizada al Crédito, en donde se necesitan como
parámetros el Nro de Documento, Tipodoc y Nro de Cuotas a financiar el crédito
SET NOCOUNT ON
-- Capturando IGV
SELECT @igv = Igv/100, @Interes = TasaInt /100 FROM parametro WHERE activo =
1
— Calculando Deuda para documento ingreado
SELECT @Deuda = SUM(cantidad * precUnit) FROM detadoc
WHERE documento = @doc AND tipodoc = @td
GO
SET NOCOUNT ON
— Preparando Tabla Temporal
DECLARE @stockac numeric(9,2)
SET @stockac = 0 — Asignando Valor
— Preparando Tabla Temporal con Movimientos para producto requerido
SELECT d.documento , d.tipodoc, d.fecha, dd.cantidad, t.signo, @stockac AS Stock—-stock se
genera con valor 0
INTO #Kardex — Permite crear una nueva tabla , en este caso #Kardex - que es temporal
FROM documento d INNER JOIN detadoc dd ON d.documento = dd.documento AND
d.tipodoc = dd.tipodoc
INNER JOIN tipodoc t ON t.tipodoc = d.tipodoc
WHERE dd.producto = @producto -- Paso 1 Declarando Cursor
DECLARE c_Kardex CURSOR
FOR SELECT documento, tipodoc, cantidad , signo FROM #Kardex ORDER BY fecha, signo
DESC -- Aparece desde el más antiguo al mas nuevo, venta mismo día 1ro ingresos
Sesión 18
IMPLEMENTANDO FUNCIONES
Algunas de estas funciones pueden ejecutarse desde una orden SELECT u otra orden
del lenguaje de modificación de datos
Objetivos
Sintaxis
AS
BEGIN
(<ordenes_sql>
RETURN <valor_devuelto_funcion>)
END
Ejemplo:
Suponga que desea calcular el interés que debe tener un documento pendiente en
función a los días transcurridos desde su emisión
• Aplicar una función escalar y determinar su utilidad a partir de una orden SELECT
RETURN @mora
END