Está en la página 1de 20

Unidad III: Entorno SQL Server, Instrucciones básicas.

1. Introducción

SQL Server Express es un producto de base de datos gratis y fácil de utilizar basado
en tecnología SQL Server 2005. El mismo está diseñado para brindar una
plataforma de base de datos que ofrece una simplicidad de uso superior,
permitiendo instalaciones más rápidas en sus escenarios. La facilidad de uso
comienza con una instalación robusta de la interface del usuario grafica (GUI) que
guía al usuario a través del proceso de instalación. Las herramientas GUI que se
encuentran incluidas sin cargo con SQL Server Express incluyen Express Manager
(versión Alfa) y Computer Manager. Estas herramientas simplifican las operaciones
de bases de datos básicas y son para desarrolladores amateurs. El diseño y
desarrollo de aplicaciones de bases de datos se vuelve más sencillo con la
integración de Visual Studio. Además, presenta la habilidad de instalar aplicaciones
de bases de datos al moverlas como archivos Windows típicos. Los servicios y
correcciones también son simples y automatizados.

SQL Server Express utiliza el mismo motor de base de datos confiable y de alta
performance que las otras versiones de SQL Server 2005. También utiliza los
mismos APIs de acceso de datos como ADO .NET, SQL Native Client, y T-SQL. De
hecho, se diferencia del resto de las ediciones de SQL Server 2005 por lo siguiente:

•Falta de características de soporte


enterprise
•Limitado a una sola CPU
•Limite de memoria de un GB para el buffer
pool
•Las bases de datos tienen un tamaño
máximo de 4GB

Escenarios Objetivo

SQL Server Express fue desarrollado con dos usos distintivos en mente. El primero
es un producto de servidor, especialmente como servidor Web o servidor de base
de datos. El segundo es un almacén de datos local donde el acceso a los datos de la
aplicación no depende de la red. La facilidad de uso y la simplicidad son los
objetivos claves del diseño.

Los tres escenarios de uso principales para SQL Server Express son:

•Desarrolladores no profesionales desarrollando aplicaciones Web


•ISVs (Independent Software Vendor) redistribuyendo SQL Server Express como un
servidor de baja disponibilidad o almacén de datos del cliente
•Desarrolladores no profesionales construyendo aplicaciones básicas
cliente/servidor

SQL Server Express brinda una plataforma de base de datos fácil de usar y confiable
que es “rica en características” para cubrir estos escenarios. Se le tiene especial
consideración a la facilidad y confiabilidad de la instalación para hacerlo fácil de
utilizar y distribuir.

Especificaciones del Motor

El motor de SQL soporta 1CPU, 1GB RAM y 4GB de tamaño de base de datos. Este
mecanismo permite una diferenciación sencilla de otras ediciones de SQL Server
2005 al tener puntos bien definidos. De otra manera, no existe un acelerador de
carga de trabajo y el motor funciona como en las otras ediciones.
SQL Server Express puede instalarse y correr en maquinas con varios procesadores,
pero solo se utiliza una CPU en cualquier momento. De manera interna, el motor
limita el número de hilos del usuario a 1 para que solo se utilice 1 CPU por vez. Las
características como ejecución de consultas paralelas no se soportan debido al
límite de una sola CPU.

El límite de 1GB RAM es el límite de memoria disponible en el buffer pool. El buffer


pool se utiliza para almacenar páginas de datos y otra información. Sin embargo, la
memoria necesaria para realizar el seguimiento de conexiones, cierres, etc., no se
cuenta hacia el límite del buffer pool. Por lo tanto es posible que el servidor utilice
más de 1GB en total, pero nunca utilizará más de 1GB en el buffer pool. Asimismo,
no soporta Address Windowing Extensions (AWE) o acceso a datos 3GB.

El límite de tamaño de base de datos de 4GB aplica solo a archivos de datos y no a


archivos log. Sin embargo, no hay límites a la cantidad de bases de datos que se
pueden asignar al servidor. Hay algunos cambios menores a la iniciación de SQL
Server Express. Las bases de datos de usuarios no comienzan automáticamente, y
DTC no se inicia automáticamente. Sin embargo, para la experiencia del usuario no
debería haber diferencia otra que un comienzo más rápido. Se recomienda que las
aplicaciones que utilizarán SQL Server Express tengan en cuenta estos cambios
cuando diseñen sus aplicaciones.

Múltiples instalaciones de SQL Server 2005 Express pueden coexistir en la misma


maquina junto con otras instalaciones de SQL Server 2000, SQL Server 2005 o
Microsoft Desktop Engine (MSDE). En general, es mejor que las instancias de SQL
Server 2000 sean actualizadas a SP3 o más. El limite máximo del numero de
instancias de SQL es 50 en la misma maquina. Estas instancias deben ser
nombradas con nombres únicos con el propósito de identificarlas.

De manera predeterminada, SQL Server Express instala una instancia named


llamada SQLEXPRESS. Esta instancia en particular debe ser compartida entre
múltiples aplicaciones y proveedores de aplicaciones. Recomendamos que utilice
esta instancia a menos que su aplicación tenga necesidades especiales de
configuración. Algunas necesidades de configuración, como por ejemplo el requisito
de autenticación Secure Socket Layer (SSL), afectan la instalación en su totalidad y
por lo tanto necesita una instancia named separada. En el resto de los casos, la
instancia compartida debería ser suficiente. Otra ventaja de utilizar la instancia
compartida es que los proveedores de aplicaciones no deben preocuparse por
instalar SQL Server Express junto con la aplicación, lo cual simplifica la instalación
de la aplicación.
Los APIs disponibles para programar contra SQL Server Express son los mismos que
aquellos para SQL Server 2005, por lo que los usuarios tienen una experiencia sin
problemas si deciden moverse a otras ediciones de SQL Server 2005. Todas las
nuevas características en SQL Server 2005, como la integración de common
language runtime (CLR), nuevos tipos de datos como VARCHAR(MAX) y XML, tipos y
agregados definidos por el usuario son soportadas. También las bases de datos SQL
Server Express pueden ser adjuntadas a SQL Server 2005, y las aplicaciones
programadas con una instancia de SQL Server Express trabajaran igual de bien con
una instancia SQL Server 2005. La replicación y la funcionalidad SQL Service Broker
también están disponibles, como describiremos más adelante en detalle.

Soporte de Replicación

La replicación permite al usuario mantener copias de datos en varios sitios


utilizando un modelo editor-suscriptor con sincronización de las copias en intervalos
definidos por el usuario. SQL Server Express soporta la suscripción a fusiones,
fotografías y publicaciones transaccionales, pero no permite publicaciones por si
misma. Las suscripciones de replicación en SQL Server Express son completamente
funcionales. Sin embargo, debido a que SQL Server Express no incluye SQL Agent,
agendar las suscripciones es más desafiante. Usted puede sincronizar las
suscripciones de SQL Server Express por medio de los siguientes métodos:

•Sincronización programática utilizando Replication Management Objects (RMO).


•Express Manager expone sincronización a demanda, pero esta característica no
esta incluida en SQL Server Technical Preview, pero estará disponible sin cargo
como una descarga Web separada.
•Utilice Windows Sync Manager para sincronización programada.

2. Crear una base de datos (motor de base de datos)

Para crear una base de datos, tiene que determinar el nombre de la base de datos,
el propietario, su tamaño y los archivos y grupos de archivos utilizados para
almacenarla.

Antes de crear una base de datos, tenga en cuenta lo siguiente:

 Para crear una base de datos, debe, como mínimo, disponer de permiso
CREATE DATABASE, CREATE ANY DATABASE o ALTER ANY DATABASE.
 En SQL Server, algunos permisos se establecen en los archivos de datos y de
registro de cada base de datos. Los permisos evitan que los archivos se
modifiquen accidentalmente si residen en un directorio sin restricción de
permisos. Para obtener más información, vea Proteger archivos de datos y de
registro.
 El usuario que crea la base de datos se convierte en su propietario.
 Pueden crearse hasta 32.767 bases de datos en una instancia de SQL Server.
 El nombre de la base de datos debe ajustarse a las reglas establecidas para
los Identificadores.
 Todos los objetos definidos por el usuario de la base de datos model se
copiarán en todas las bases de datos recién creadas. Puede agregar a la base
de datos model todos los objetos (tablas, vistas, procedimientos
almacenados, tipos de datos, etc.) que desee incluir en todas las bases de
datos recién creadas.

Archivos y grupos de archivos de base de datos

Se utilizan tres tipos de archivos para almacenar una base de datos. Éstos incluyen
archivos principales, archivos secundarios y registros de transacciones. La base de
datos debe tener un archivo de datos principal y, como mínimo, un archivo de
registro de transacciones. Tiene la opción de crear uno o varios archivos de datos
secundarios así como archivos de registro de transacciones adicionales.

Archivos principales

Estos archivos contienen la información de inicio de la base de datos. Se


utilizan también para almacenar datos. Cada base de datos tiene un archivo
principal.

Archivos secundarios

Estos archivos contienen todos los datos que no caben en el archivo de datos
principal. No es necesario que las bases de datos tengan archivos de datos
secundarios si el archivo principal es lo suficientemente grande como para
contener todos los datos. Algunas bases de datos pueden ser muy grandes y
necesitar varios archivos de datos secundarios o utilizar archivos secundarios
en unidades de disco distintas, de modo que los datos estén distribuidos en
varios discos.

Registros de transacciones

Estos archivos contienen la información de registro que se utiliza para


recuperar la base de datos. Cada base de datos debe tener al menos un
archivo de registro de transacciones, aunque puede tener más de uno. El
tamaño mínimo de un archivo de registro es de 512 KB.

Cuando cree una base de datos, defina el mayor tamaño posible para los archivos
de datos, según la cantidad de datos máxima prevista para la base datos.

Inicialización de archivos

Los archivos de datos y de registro se inicializan para sobrescribir los datos


existentes que queden en el disco de archivos eliminados anteriormente. También
se inicializan y se llenan con ceros cuando se realiza alguna de las siguientes
operaciones:
 Crear una base de datos
 Agregar archivos a una base de datos existente
 Aumentar el tamaño de un archivo existente
 Restaurar una base de datos o un grupo de archivos

3. Rendimiento de la base de datos

Cuando diseñe una base de datos, debe asegurarse de que realiza todas las
operaciones importantes de forma rápida y correcta. Algunos problemas de
rendimiento se pueden resolver una vez que la base de datos se encuentra en
producción. Sin embargo, otros pueden ser el resultado de un diseño inadecuado y
se pueden solucionar mediante el cambio de la estructura y el diseño de la base de
datos.

Cuando diseña e implementa una base de datos, debe identificar las tablas de gran
tamaño y los procesos más complejos que realizará la base de datos. También debe
prestar una atención especial al rendimiento cuando diseña estas tablas. Además,
debe considerar los efectos que puede tener en el rendimiento el aumento del
número de usuarios con acceso a la base de datos.

Los siguientes cambios de diseño, entre otros, pueden mejorar el rendimiento:

 Si una tabla que contiene cientos de miles de filas debe resumirse en un


informe diario, puede agregar a la tabla una o varias columnas que
contengan datos previamente agregados para utilizarlos sólo en dicho
informe.
 Las bases de datos pueden normalizarse en exceso. Esto significa que la base
de datos se define con un gran número de tablas pequeñas interrelacionadas.
Cuando la base de datos procesa los datos de estas tablas, debe realizar
muchas más operaciones para combinar los datos relacionados. Este
procesamiento adicional puede repercutir negativamente en el rendimiento
de la base de datos. En esos casos, una reducción de la normalización de la
base de datos para simplificar procesos complejos puede mejorar el
rendimiento.

Consideraciones acerca del hardware

Por lo general, cuanto mayor es la base de datos, mayores son los requisitos de
hardware. Sin embargo, entre otros factores determinantes se incluyen el número
de sesiones o usuarios simultáneos, el rendimiento de las transacciones y el tipo de
operaciones que se realicen en la base de datos. Por ejemplo, los requisitos de
hardware de una base de datos que contenga datos que se actualicen con poca
frecuencia (para una biblioteca escolar, por ejemplo) serán inferiores a los requisitos
de un almacén de datos de 1 terabyte que contenga datos de acceso frecuente de
ventas, productos y clientes de una gran compañía. Además de los requisitos de
almacenamiento en disco, se necesitará más memoria y procesadores más rápidos
para que el almacén de datos pueda guardar en la memoria caché más datos y para
que las consultas que hacen referencia a grandes cantidades de datos se puedan
procesar con más rapidez.
El subsistema de E/S, o motor de almacenamiento, es un componente clave de
cualquier base de datos relacional y requiere la mayor parte del planeamiento. Una
implementación correcta de base de datos suele requerir un diseño cuidadoso en
las primeras etapas de un proyecto. Este planeamiento o diseño debería tener en
cuenta lo siguiente:

 El tipo de disco que se va a utilizar, por ejemplo, los dispositivos RAID (matriz
redundante de discos independientes).
 Cómo se van a colocar los datos en los discos.
 El diseño de índices que se va a utilizar con el fin de mejorar el rendimiento
de las consultas para tener acceso a los datos.
 Cómo se van a establecer correctamente todos los parámetros de
configuración para que la base de datos obtenga un buen rendimiento.
4. Introducción a Transact SQL

SQL es un lenguaje de consulta para los sistemas de bases de datos relaciónales,


pero que no posee la potencia de los lenguajes de programación.

Transact SQL es el lenguaje de programación que proporciona SQL Server para


ampliar SQL con los elementos característicos de los lenguajes de programación:
variables, sentencias de control de flujo, bucles, etc.

Cuando se desea realizar una aplicación completa para el manejo de una base de
datos relacional, resulta necesario utilizar alguna herramienta que soporte la
capacidad de consulta del SQL y la versatilidad de los lenguajes de programación
tradicionales. Transact SQL es el lenguaje de programación que proporciona SQL
Server para extender el SQL estándar con otro tipo de instrucciones.

Fundamentos de Transact SQL

Para programar en Transact SQL es necesario conocer sus fundamentos.

Como introducción vamos a ver algunos elementos y conceptos básicos del


lenguaje.

 Transact SQL no es CASE-SENSITIVE, es decir, no diferencia mayúsculas de


minúsculas como otros lenguajes de programación como C o Java.
 Un comentario es una aclaración que el programador incluye en el código.
Son soportados 2 estilos de comentarios, el de línea simple y de multilínea,
para lo cual son empleados ciertos caracteres especiales como son:

 -- Para un comentario de línea simple


 /* ... */ Para un comentario de varias líneas

 Un literal es un valor fijo de tipo numérico, carácter, cadena o lógico no


representado por un identificador (es un valor explícito).
 Una variable es un valor identificado por un nombre (identificador) sobre el
que podemos realizar modificaciones. En Transact SQL los identificadores de
variables deben comenzar por el carácter @, es decir, el nombre de una
variable debe comenzar por @.Para declarar variables en Transact SQL
debemos utilizar la palabra clave declare, seguido del identificador y tipo de
datos de la variable.

Tipos de datos numéricos.

SQL Server dispone de varios tipos de datos numéricos. Cuanto mayor sea el
número que puedan almacenar mayor será en consecuencia el espacio utilizado
para almacenarlo. Como regla general se recomienda usar el tipo de dato mínimo
posible. Todos los datos numéricos admiten el valor NULL.

Bit. Una columna o variable de tipo bit puede almacenar el rango de valores de 1
a 0.

Tinyint. Una columna o variable de tipo tinyint puede almacenar el rango de


valores de 0 a 255.

SmallInt. Una columna o variable de tipo smallint puede almacenar el rango de


valores -32768 a 32767.

Int. Una columna o variable de tipo int puede almacenar el rango de valores -231 a
231-1.

BigInt. Una columna o variable de tipo bigint puede almacenar el rango de valores
-263 a 263-1.

Decimal(p,s). Una columna de tipo decimal puede almacenar datos numéricos


decimales sin redondear. Donde p es la precisión (número total del dígitos) y s la
escala (número de valores decimales)

Float. Una columna de datos float puede almacenar el rango de valores -1,79x-
10308 a 1,79x-10308, si la definimos con el valor máximo de precisión. La precisión
puede variar entre 1 y 53.

Real. Sinónimo de float. Puede almacenar el rango de valores -3,4x-1038 a 3,4x-


1038,

Money. Almacena valores numéricos monetarios de -263 a 263-1, con una precisión
de hasta diez milésimas de la unidad monetaria.

SmallMoney. Almacena valores numéricos monetarios de -214.748,3647 a


214.748,3647, con una precisión de hasta diez milésimas de la unidad monetaria.

Tipos de datos de carácter.


Char(n). Almacena n caracteres en formato ASCII, un byte por cada letra. Cuando
almacenamos datos en el tipo char, siempre se utilizan los n caracteres indicados,
incluso si la entrada de datos es inferior. Por ejemplo, si en un char(5), guardamos
el valor 'A', se almacena 'A ', ocupando los cinco bytes.

Varchar(n). Almacena n caracteres en formato ASCII, un byte por cada letra.


Cuando almacenamos datos en el tipo varchar, únicamente se utilizan los
caracteres necesarios, Por ejemplo, si en un varchar(255), guardamos el valor 'A', se
almacena 'A', ocupando solo un byte bytes.

Varchar(max). Igual que varchar, pero al declararse como max puede almacenar
231-1 bytes.

Nchar(n). Almacena n caracteres en formato UNICODE, dos bytes por cada letra.
Es recomendable utilizar este tipo de datos cuando los valores que vayamos a
almacenar puedan pertenecer a diferente idiomas.

Nvarchar(n). Almacena n caracteres en formato UNICODE, dos bytes por cada


letra. Es recomendable utilizar este tipo de datos cuando los valores que vayamos a
almacenar puedan pertenecer a diferente idiomas.

Nvarchar(max). Igual que varchar, pero al declararse como max puede almacenar
231-1 bytes.

Tipos de datos de fecha.

Datetime. Almacena fechas con una precisión de milisegundo. Debe usarse para
fechas muy específicas.

SmallDatetime. Almacena fechas con una precisión de minuto, por lo que ocupa la
mitad de espacio de que el tipo datetime, para tablas que puedan llegar a tener
muchos datos es un factor a tener muy en cuenta.

TimeStamp. Se utiliza para marcar un registro con la fecha de inserción -


actualización. El tipo timestamp se actualiza automáticamente cada vez que
insertamos o modificamos los datos.

Tipos de datos binarios.

Binary. Se utiliza para almacenar datos binarios de longitud fija, con una longitud
máxima de 8000 bytes.

Varbinary. Se utiliza para almacenar datos binarios de longitud variable, con una
longitud máxima 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


5. Consultar datos en Transact SQL

La sentencia SELECT

La sentencia SELECT nos permite consultar los datos almacenados en una tabla
de la base de datos.

El formato de la sentencia select es:

SELECT [ALL | DISTINCT ][ TOP expression [ PERCENT ] [ WITH TIES ] ]


<nombre_campos>
FROM <nombre_tabla>
[ INNER | LEFT [OUTER]| RIGHT [OUTER] | CROSS]
[JOIN ] <nombre_tabla> ON <condicion_join>[ AND|OR <condicion>]
[WHERE <condicion> [ AND|OR <condicion>]]
[GROUP BY <nombre_campos>]
[HAVING <condicion>[ AND|OR <condicion>]]
[ORDER BY <nombre_campo> [ASC | DESC]

El siguiente ejemplo muestra una consulta sencilla que obtiene el código y la


"familia" de una tabla llamada familias (representaría familias de productos por
ejemplo).

SELECT CO_FAMILIA, FAMILIA

FROM FAMILIAS

El uso del asterisco indica que queremos que la consulta devuelva todos los
campos que existen en la tabla.

SELECT *

FROM FAMILIAS

Ahora vamos a realizar una consulta obteniendo además de los datos de familias,
los datos de las categorías y los productos.

SELECT *
FROM FAMILIAS

INNER JOIN CATEGORIAS

ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA

INNER JOIN PRODUCTOS

ON PRODUCTOS.CO_CATEGORIA = CATEGORIAS.CO_CATEGORIA
La combinación se realiza a través de la clausula INNER JOIN, que es una cláusula
exclusiva, es decir las familias que no tengan categorías y productos asociados no
se devolverán.

Si queremos realizar la consulta para que no sea exclusiva, tenemos que utilizar
LEFT JOIN. El uso de la palabra reservada OUTER es opcional.

SELECT *

FROM FAMILIAS

LEFT OUTER JOIN CATEGORIAS

ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA

LEFT OUTER JOIN PRODUCTOS

ON PRODUCTOS.CO_CATEGORIA = CATEGORIAS.CO_CATEGORIA

Los registros que no tengan datos relacionados en una consulta LEFT JOIN
devolverán en valor null en los campos que correspondan a las tablas en las que no
tienen dato.

También podemos forzar un producto cartesiano (todos con todos) a través de


CROSS JOIN.

SELECT * FROM FAMILIAS

CROSS JOIN CATEGORIAS

La cláusula WHERE

La cláusula WHERE es la instrucción que nos permite filtrar el resultado de una


sentencia SELECT.

SELECT CO_FAMILIA, FAMILIA

FROM FAMILIAS

WHERE CO_FAMILIA = 1

Por supuesto, podemos especificar varias condiciones para el WHERE:

SELECT *

FROM FAMILIAS
WHERE CO_FAMILIA = 1

OR CO_FAMILIA = 2
Podemos agrupar varios valores para una condición en la clausula IN:
SELECT *

FROM FAMILIAS

WHERE CO_FAMILIA IN ( 1 , 2)

La clausula WHERE se puede utilizar conjuntamente con INNER JOIN, LEFT JOIN.
SELECT FAMILIAS.CO_FAMILIA,

FAMILIAS.FAMILIA

FROM FAMILIAS

INNER JOIN CATEGORIAS

ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA

WHERE FAMILIAS.CO_FAMILIA > 1

Siempre que incluyamos un valor alfanumérico para un campo en la condición


WHERE este debe ir entre comillas simples:

SELECT *

FROM FAMILIAS

WHERE FAMILIA = 'FAMILIA 1'

Para consultar campos alfanuméricos, es decir, campos de texto podemos utilizar


el operador LIKE conjuntamente con comodines.

SELECT *

FROM FAMILIAS

WHERE FAMILIA LIKE 'FAM%'

Los comodines que podemos utilizar en son los siguientes:

• % , representa cualquier cadena de texto de cero o más caracteres de


cualquier longitud.
• _ , representa un caracter.
• [a-d], representa cualquier carácter del intervalo a-d.
• [abcd], representa cualquier carácter del grupo abcd.
• [^a-d], representa cualquier carácter diferente del intervalo a-d.
• [^abcd], representa cualquier carácter distinto del grupo abcd.

También podemos obtener los valores distintos utilizando DISTINCT.

SELECT DISTINCT FAMILIA -- Devuelve los distintos valores de FAMILIA

FROM FAMILIAS

Podemos limitar el número de registros que devuelve la consulta a través de la


clausula TOP. La clausula TOP admite como parámetros un valor numérico entero o
un porcentaje (sólo a partir de la versión 2005)

SELECT TOP 10 * -- Devuelve 10 registros

FROM FAMILIAS

SELECT TOP 50 PERCENT * -- Devuelve el 50% de los registros

FROM FAMILIAS

La cláusula ORDER BY

Podemos especificar el orden en el que serán devueltos los datos a través de la


cláusula ORDER BY.

SELECT CO_FAMILIA, FAMILIA

FROM FAMILIAS

ORDER BY FAMILIA DESC

También podemos indicar el índice del campo en la lista de selección en lugar de


su nombre:

SELECT CO_FAMILIA, FAMILIA

FROM FAMILIAS

ORDER BY 2 DESC -- Ordena por FAMILIA


6. Insertar datos en Transact SQL

Inserción individual de filas.

Para realizar la inserción individual de filas SQL posee la instrucción INSERT INTO.
La inserción individual de filas es la que más comúnmente utilizaremos. Su sintaxis
es la siguiente:

INSERT INTO <nombre_tabla>


[(<campo1>[,<campo2>,...])]
values
(<valor1>,<valor2>,...);

El siguiente ejemplo muestra la inserción de un registro en la tabla PRECIOS.

INSERT INTO PRECIOS

(PRECIO, FX_INICIO, FX_FIN, CO_PRODUCTO)

VALUES

(10, getdate(),getdate()+30, 1)

Inserción múltiple de filas.

También es posible insertar en una tabla el resultado de una consulta SELECT. De


este modo se insertarán tantas filas como haya devuelto la consulta SELECT.

El siguiente ejemplo muestra la inserción múltiple de filas.

INSERT INTO PRECIOS (PRECIO, FX_INICIO, FX_FIN, CO_PRODUCTO)

SELECT PRECIO_UNIDAD,

getdate(),

getdate() + 30,

CO_PRODUCTO

FROM DETALLE_PEDIDO

Inserción de valores por defecto.

También podemos forzar a que la inserción se realice con los datos por defecto
establecidos para la tabla (o null si no tienen valores por defecto).
INSERT INTO PRECIOS DEFAULT VALUES

En SQL Sever podemos marcar un campo de una tabla como autonumérico


(identity), cuando insertamos un registro en dicha tabla el valor del campo se
genera automáticamente. Para recuperar el valor generado disponemos de varios
métodos:

• Utilizar la función @@identity, que devuelve el último valor identidad


insertado por la transacción:

DECLARE @Codigo int

INSERT INTO PRECIOS

(PRECIO, FX_INICIO, FX_FIN, CO_PRODUCTO)

VALUES

(10, getdate(),getdate()+30, 1)

set @Codigo = @@Identity

PRINT @Codigo

El uso de @@Identity no siempre es válido, ya que al devolver el último valor


identidad insertado por la transacción, no nos garantiza que el valor haya sido
insertado en la tabla que nos interesa (por ejemplo la tabla podría tener un trigger
que insertara datos en otra tabla con campos identidad).

• En este tipo de escenarios debemos utilizar la función, SCOPE_IDENTITY.

DECLARE @Codigo int

INSERT INTO PRECIOS

(PRECIO, FX_INICIO, FX_FIN, CO_PRODUCTO)

VALUES

(10, getdate(),getdate()+30, 1)

SET @Codigo = SCOPE_IDENTITY()

PRINT @Codigo
Clausula OUTPUT

A partir de la versión de SQL Server 2005 disponemos de la clausula OUTPUT


para recuperar los valores que hemos insertado. Al igual que en un trigger
disponemos de las tablas lógicas INSERTED y DELETED.

Las columnas con prefijo DELETED reflejan el valor antes de que se complete la
instrucción UPDATE o DELETE. Es decir, son una copia de los datos "antes" del
cambio.

DELETED no se puede utilizar con la cláusula OUTPUT en la instrucción INSERT.

Las columnas con prefijo INSERTED reflejan el valor después de que se complete
la instrucción UPDATE o INSERT, pero antes de que se ejecuten los
desencadenadores. Es decir, son una copia de los datos "después" del cambio.

INSERTED no se puede utilizar con la cláusula OUTPUT en la instrucción DELETE.

DECLARE @FILAS_INSERTADAS TABLE

( CO_PRECIO int,

PRECIO decimal,

FX_INICIO datetime,

FX_FIN datetime,

CO_PRODUCTO int

INSERT INTO PRECIOS

(PRECIO, FX_INICIO, FX_FIN, CO_PRODUCTO)

OUTPUT INSERTED.* INTO @FILAS_INSERTADAS

VALUES

(10, getdate(),getdate()+30, 1)

SELECT * FROM @FILAS_INSERTADAS


7. Actualizar datos en Transact SQL

Update

Para la actualización de datos Transact SQL dispone de la sentencia UPDATE. La


sentencia UPDATE permite la actualización de uno o varios registros de una única
tabla. La sintaxis de la sentencia UPDATE es la siguiente

UPDATE <nombre_tabla>
SET <campo1> = <valor1>
{[,<campo2> = <valor2>,...,<campoN> = <valorN>]}
[ WHERE <condicion>];

El siguiente ejemplo muestra el uso de UPDATE.

UPDATE CLIENTES

SET

NOMBRE = 'Devjoker',

APELLIDO1 = 'Herrarte',

APELLIDO2 = 'Sánchez'

WHERE CO_CLIENTE = 10

Un aspecto a tener en cuenta, sobre todo si has trabajado con ORACLE, 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 explicita con la instrucción BEGIN TRAN.

Update INNER JOIN

En ocasiones queremos actualizar los datos de una tabla con los datos de otra
(muy común para desnormalizar un modelo de datos).

Habitualmente, usamos subconsultas para este propósito, pero Transact SQL


permite la utilización de la sentencia UPDATE INNER JOIN.

UPDATE CLIENTES

SET

NOMBRE = FICHERO_CLIENTES.NOMBRE,

APELLIDO1 = FICHERO_CLIENTES.APELLIDO1,
APELLIDO2 = FICHERO_CLIENTES.APELLIDO2

FROM CLIENTES

INNER JOIN FICHERO_CLIENTES

ON FICHERO_CLIENTES.CO_CLIENTE = CLIENTES.CO_CLIENTE

Clausula OUTPUT

DECLARE @FILAS_ACTUALIZADAS TABLE

( CO_CLIENTE int ,

NOMBRE varchar(100),

APELLIDO1 varchar(100),

APELLIDO2 varchar(100)

UPDATE CLIENTES

SET

NOMBRE = 'Devjoker',

APELLIDO1 = 'Herrarte',

APELLIDO2 = 'Sánchez'

OUTPUT DELETED.* INTO @FILAS_ACTUALIZADAS

WHERE CO_CLIENTE IN (10, 11, 12)

SELECT * FROM @FILAS_ACTUALIZADAS

Las columnas con prefijo INSERTED reflejan el valor después de que se complete
la instrucción UPDATE o INSERT, pero antes de que se ejecuten los
desencadenadores. Es decir, son una copia de los datos "después" del cambio.
DECLARE @FILAS_ACTUALIZADAS TABLE

( CO_CLIENTE int ,

NOMBRE varchar(100),

APELLIDO1 varchar(100),

APELLIDO2 varchar(100)

UPDATE CLIENTES

SET

NOMBRE = 'Devjoker',

APELLIDO1 = 'Herrarte',

APELLIDO2 = 'Sánchez'

OUTPUT INSERTED.* INTO @FILAS_ACTUALIZADAS

WHERE CO_CLIENTE IN (10, 11, 12)

SELECT * FROM @FILAS_ACTUALIZADAS

8. Borrar datos en Transact SQL

Delete

Para borrar datos de una tabla debemos utilizar la sentencia DELETE.

Para ejecutar los ejemplos de este capitulo debemos ejecutar el siguiente script,
que crea la tabla "DATOS" y carga registros en ella.

CREATE TABLE DATOS

Id int identity not null,

dato varchar(100),

fx_alta datetime,
constraint PK_DATOS PRIMARY KEY (Id)

GO

DECLARE @i int,

@dato varchar(100)

set @i = 0

WHILE (@i <100)

BEGIN

SET @i = @i +1

set @dato = 'Dato:' + cast(@i as varchar)

INSERT INTO DATOS (dato, fx_alta)

VALUES (@dato, getdate())

END

GO

SELECT * from DATOS

Para borrar los registros de la tabla "DATOS" ejecutaremos la siguiente


instrucción. Nótese que no se especifica ninguna condición WHERE por lo que se
borran todos los datos de la tabla.

DELETE

FROM DATOS

Lógicamente podemos especificar que registros queremos borrar a través de la


clausula WHERE.

DELETE

FROM DATOS

WHERE Id=12
Cuando borramos datos de una tabla, podemos obtener el número de filas que
han sido afectadas por la instrucción a través de la variable @@RowCount.

El siguiente ejemplo ilustra el uso de @@RowCount.

DELETE

FROM DATOS

WHERE Id=17

SELECT @@ROWCOUNT

Truncate Table

Para borrar datos de forma masiva disponemos de la instrucción TRUNCATE


TABLE, que borra todos los datos de una tabla.

TRUNCATE TABLE DATOS

Cuando trabajamos con TRUNCATE TABLE debemos tener en cuenta las


siguientes consideraciones:

 TRUNCATE TABLE no admite la clausula WHERE.


 No podemos ejecutar TRUNCATE TABLE sobre tablas que sean "padres" en
foreign keys.

También podría gustarte