Вы находитесь на странице: 1из 7

Transact SQL 2005

Este documento describe las nuevas caracteristicas de T-SQL para SQL Server 2005. Introduccion
Microsoft Sql Server 2005 (YUKO ! es un producto con muchas novedades comparndolo con su antecesor SQL 2000. Sin duda que uno de sus mayores cambios ha sido la inclusi n del CLR dentro del motor de base de datos. !n este art"culo nos concentraremos en al#unas de las tantas novedades que nos trae Microsoft SQL 2005 en lo que respecta a $ransact%SQL& las cuales sern de mucha utilidad para los desarrolladores de aplicaciones como as" tambi'n para los ()*. $ransact SQL (TSQL+ es el len#ua,e que usamos para escribir - Store .rocedures / $ri##ers / Querys / !tc. Sin dudas que $SQL no dispone de las mismas habilidades y potencia que puede tener un len#ua,e como 01 o 2).3!$. !n Sql2005 veremos un cambio si#nificativo en $SQL el cual nos ayudara en nuestro traba,o diario. *ntes de empe4ar les recomiendo que descar#uen la versi n )eta de Sql%Server 5une 2005 del si#uiente lin6http-77888.microsoft.com7do8nloads7details.asp9:;amily<d=)>?>)00;%!200%>0*)%*?>@% !*0*2A@>0;?BCdisplaylan#=en Decomiendo que dicha instalaci n se realice en un ambiente de testin# como podr"a ser una maquina 2irtual.

Numerando Registros (RowId):


!n muchas ocasiones es necesario poder obtener una columna con el nEmero de re#istro o tambi'n poder #enerar un ran6in#. Fasta SQL2000 este tipo de operaciones no eran tan simples de reali4ar y no dispon"amos de instrucciones directas. !n $SQL 2005 disponemos de una serie de instrucciones las cuales nos hacen el traba,o mucho mas simple y eficiente. 2eamos de qu' se trata ello. Row_Number: !sta nueva funci n de $SQL nos permitir numerar los resultados de una query. !l si#uiente e,emplo muestra el uso de esta funci nUse AdventureWorks Go Select row_number() over(order by name) as rowid, name,productNumber,productId rom !roduction"product w#ere productnumber like $be%$ order by name

!l resultado obtenido de esta query es el si#uiente-

ro8id %%%%%%%% ? 2

name product3umber product<d %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%% )) )all )earin# )!%2G>B G Feadset )all )earin#s )!%2B0H >

* las funciones de numeraci n como Do8Inumber(+ le podemos a#re#ar la clusula Partition la cual nos permitir numerar pero haciendo un corte y reiniciando el numerador a partir de ese corte. !n el si#uiente e,emplo hacemos uso de elloUse AdventureWorks Go Select row_number() over(partition by color order by name) as rowid, name,productNumber,productId,color rom !roduction"product w#ere color in ($&lue$,$Silver$) order by color,name !ste e,emplo nos retornara un listado de productos donde el color sea )lue o Silver y los numerara con ro8id pero al cambiar el color el numerador volver a comen4ar.

ro8id name product3umber product<d color %%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%% %%%%%%%%%%%%%%% J 25 $ourin#%G000 )lue& 5H )K%$?HL%5H B5B )lue 2A $ourin#%G000 )lue& A2 )K%$?HL%A2 BA0 )lue ? 0hain 0F%02G> B52 Silver 2 0hainrin# )olts 0)%2B0G G20 Silver G 0hainrin# 3ut 03%A?G@ G2? Silver > ;ree8heel ;F%2BH? GG2 Silver J
Conclusiones: La instrucci n Do8Inumber(+ nos da la habilidad de poder numerar los resultados de nuestras querys& este tipo de tareas eran muy solicitadas por los usuarios en la versi n 2000 y no e9ist"a una soluci n directa como la que podemos tener ahora con Sql2005. (e todas maneras vale aclarar un concepto- Los motores de base de datos estn pensados para traba,ar en con,unto de re#istros y no re#istr a re#istro& por lo cual les recomiendo que el uso de numeradores lo utilicen con criterio y que no se lo utilice para recorrer re#istr a re#istro (cursores+.

TOP @n:
$sql2005 incorpora una nueva funcionalidad a la instrucci n $M.& hasta la versi n 2000 no se le pod"a pasar un parmetro variable a la misma& en la versi n 2005 esta funcionalidad se ha a#re#ado. !l si#uiente e,emplo nos muestra como se implementa-

US' A()'N*U+'W,+-S G, ('./A+' 0NU1 IN* S'* 0NU1 2 3 S'/'.* *,!(0NU1) 4 5+,1 !+,(U.*I,N"!+,(U.*

!n el si#uiente e,ercicio veremos como podemos utili4ar $M. Nn para eliminar re#istros de a #ruposUse AdventureWorks Go

I5 ,&6'.*_I(($G+AN('$) IS N,* NU// (+,! *A&/' G+AN(' G, .+'A*' *A&/' G+AN(' (I( IN* I('N*I*7,N,1&+' )A+.8A+(9::), (I+'..I,N )A+.8A+(9::)) G, ('./A+' 0N IN* S'* 0N 2 9 W8I/' 0N ;2 <:::: &'GIN INS'+* IN*, G+AN(' (N,1&+',(I+'..I,N) )A/U'S ($S=/$ > .,N)'+*()A+.8A+(9:),0N),$(I+$ > .,N)'+*()A+.8A+(9:),0N)) S'* 0N 2 0N>9 'N( G, ?4 &,++A1,S !,+ !A+*'S ((' A <::) USAN(, +,W.,UN* 7 *,! 4? S'* +,W.,UN* <:: ('/'*' *,!(<::) 5+,1 G+AN(' W8I/' 00+,W.,UN* @ : ('/'*' *,!(<::) 5+,1 G+AN(' S'* +,W.,UN* : Conclusiones: Sin lu#ar a dudas que muchos de los desarrolladores y ()* que venimos traba,ando con Sql2000 estbamos reclamando esta funcionalidad del $M.& con la misma como se podr observar se pueden lo#rar muchas funcionalidades que antes se deb"an resolver qui4s con SQL%(inmico.

ontro! de errores:
$sql 2005 incorpora al control de errores los bloques $DO..0*$F. La administraci n de errores de esta manera es conocida por los desarrolladores de la actualidad ya que .3!$ administra de la misma manera. !n esta secci n les mostrare varios e,emplos de su utili4aci n. .ara poder reali4ar estos e,ercicios he creado una tabla de prueba US' A()'N*U+'W,+-S G, I5 ,&6'.*_I(($'1!/'A(,S$) IS N,* NU// (+,! *A&/' '1!/'A(,S G, .+'A*' *A&/' '1!/'A(,S (I( IN* !+I1A+7 -'7, N,1&+' )A+.8A+(3:) N,* NU//) G, !n nuestro primer e,emplo veremos como poder capturar un error al intentar reali4ar una operaci n de insert sobre nuestra tabla donde el campo ombre no admite valores nulos.

&'GIN *+7 INS'+* IN*, '1!/'A(,S )A/U'S (9,NU//) !+IN* $!AS, '/ INS'+*$ 'N( *+7 &'GIN .A*.8

!+IN* $*'N'1,S '/ '++,+ NU1'+,A$ > .,N)'+*()A+.8A+(9:),'++,+_NU1&'+()) 'N( .A*.8 0omo podemos observar al suceder un error SQL sale a la secci n 0*$0F donde capturamos el mismo y podemos informar al usuario con al#En mensa,e. !n este e,emplo se hace uso de la funci n !DDMDI3LM)!D(+ las cual nos retorna el nEmero de error& pero tambi'n podr"amos hacer uso de las si#uientes funcionesERROR_LINE() - Detorna el nEmero de l"nea donde se #enero el error. !l resultado es 3LLL cuando el error se #enero fuera del bloque $ry. ERROR_MESSAGE(): Detorna el te9to del error. ERROR_PROCEDURE(): Detorna el nombre del .rocedimiento *lmacenado o el $ri##er desde donde se ha #enerado el error en el bloque $ry 0atch ERROR_SE ERI!"(): Detorna la severidad del error !l si#uiente e,emplo #enera un error en el primer insert y automticamente se pasa a la secci n 0atch sin e,ecutar la se#unda instrucci n& adems en el modulo 0atch evaluamos el nEmero de error y personificamos el mensa,e emitido al usuario. &'GIN *+7 INS'+* IN*, '1!/'A(,S )A/U'S ($9$,NU//) INS'+* IN*, '1!/'A(,S )A/U'S ($9$,$1ABI$) !+IN* $!AS, '/ INS'+*$ 'N( *+7 &'GIN .A*.8 I5 '++,+_NU1&'+() 2 <9< &'GIN !+IN* $ 8A7 A/GUNAS .,/U1NAS =U' N, A(1I*'N NU/,SA $ > '++,+_1'SSAG'() 'N( '/S' I5 '++,+_NU1&'+() 2 C9<D &'GIN !+IN* $ S' 8A S,&+'!ASA(, '/ 1ABI1, (' UN .A1!,A $ > '++,+_1'SSAG'() 'N( '/S' &'GIN !+IN* $*'N'1,S '/ '++,+ NU1'+,A$ > .,N)'+*()A+.8A+(9:),'++,+_NU1&'+()) > $ $ > '++,+_1'SSAG'() 'N( 'N( .A*.8

Conclusiones: !l mane,o de los errores en sql2005 ha me,orado considerablemente comparado con su antecesor& ahora como se podr observar no es necesario ir controlando la variable NNerror por cada instrucci n que reali4amos& con el uso de los bloques $ry.. 0acth es mucho ms simple y adems mantiene la metodolo#"a de .3!$. !n este articulo no hemos tratado como mane,ar errores cuando e9isten transacciones de por medio& pero el mane,o de las mismas en sql2005 es mucho mas simple y ami#able que en la versi n 2000. Si se desea ampliar sobre este tema les recomiendo que lean sobre la funci n XACT_STATE en sus libros online ()ML+.

"#$ %ara co!umnas din&micas:


!n sql2005 disponemos de la caracter"stica M*P para los tipos de datos 2*D0F*D& 32*D0F*D y 2*D)<3*DO. La idea de esta caracter"stica es poder ampliar la capacidad de estos tipos de datos. !n sql2000 estos tipos de datos dispon"an un m9imo de H000 y >000 (para los 3varchar+& con M*P se puede almacenar hasta 2Q) de informaci n en estos tipos de datos. La idea seria reempla4ar donde se pueda este tipo de datos por los vie,os <M*Q! & $!P$ y 3$!P$.

!l si#uiente e,emplo nos muestra la utili4aci n de esta caracter"sticaUse AdventureWorks Go .reate table emp (id int identity, nombre varc#ar(<:), descripcion varc#ar(maE)) Fo Insert into emp (nombre,descripcion) values ($A9$,$esto es una prueba de 1aE$) Go Update emp set descripcion2$nuestro primer update$ Go

Conclusiones: !sta nueva capacidad en los tipos de datos 2archar& 3varchar y 3arbinary es mucho ms simple que los vie,os <ma#e& $e9t y 3te9t. (e todas maneras habr que anali4ar bien cuando es conveniente mi#rar a este tipo de datos& si la aplicaci n es nueva yo recomendar"a utili4arlos en lu#ar de sus pares de la versi n 2000.

S'T (e)au!t * S'T N+LL ((RI #ctions):


SQL Server 2005 )eta2 incluye soporte para dos (2+ nuevas (D< actions ((eclarative Deferential <nte#rity+. !stas nuevas (D< *ctions se utili4aran en las relaciones ;orei#n Key tanto para L.(*$! como para (!L!$!. !l si#uiente e,emplo nos muestra como usar S!$ (!;*LL$ y S!$ 3LLL-

?4(+I ((eclarative +e erencial .onstraint) S'* ('5AU/* and S'* NU// 4? Use AdventureWorks Go i Go I Go .reate table .lientes (id varc#ar(9:) !rimary -ey, nombre varc#ar(9::)) Go obGect_id($clientes$) is not null drop table clientes obGect_id($pedidos$) is not null drop table pedidos

INS'+* INS'+* INS'+* INS'+* Go

IN*, IN*, IN*, IN*,

./I'N*'S ./I'N*'S ./I'N*'S ./I'N*'S

)A/U'S )A/U'S )A/U'S )A/U'S

($1I.+,S,5*$,$1I.+,S,5*$) ($I&1$,$I&1$) ($SA!$,$SA!$) ($8!$,$8!$)

.reate *able !edidos (numero int !rimary -ey,cliente_id varc#ar(9:) de ault($1I.+,S,5*$), ec#a datetime, constraint k_9 5oreiFn -ey (.liente_id) +e erences .lientes(id) ,N ('/'*' S'* NU// ,N U!(A*' S'* ('5AU/*) Go Fasta aqu" hemos creados dos(2+ tablas& una llamada Clientes y la otra Pedidos& en esta ultima hemos a#re#ado una relaci n con la primera y se ha definido que ante una acci n de (!L!$! (en clientes+ se introdu4ca 3ull en el campo Cliente_id de .edidos y ante una acci n de L.(*$! se introdu4ca el valor (efault de dicho campo.

INS'+* INS'+* INS'+* INS'+* INS'+* INS'+* G,

IN*, IN*, IN*, IN*, IN*, IN*,

!'(I(,S !'(I(,S !'(I(,S !'(I(,S !'(I(,S !'(I(,S

)A/U'S )A/U'S )A/U'S )A/U'S )A/U'S )A/U'S

(9,$I&1$,G'*(A*'()) (D,$8!$,G'*(A*'()>9:) (3,$SA!$,G'*(A*'()HI<) (J,$I&1$,G'*(A*'()>3I<) (<,$1I.+,S,5*$,G'*(A*'()>K<) (I,$SA!$,G'*(A*'()>99:)

*hora que tenemos los re#istros en nuestras dos (2+ tablas& haremos una acci n (elete en Clientes y observaremos que ha sucedido con esos re#istros en la tabla Pedidos ('/'*' 5+,1 ./I'N*'S W8'+' I( 2$I&1$ G, S'/'.* numero,cliente_id 5+,1 !'(I(,S Go numero cliente_id HHHHHHHHHHH HHHHHHHHHH 9 NULL D " " " "" 0omo podemos observar el re#istro (?+ que conten"a el cliente <)M & ahora el campo de referencia tiene un valor 3ull ya que hemos eliminado su maestro de la tabla Clientes y nuestro (D< actions indicaba que se deb"a introducir 3ull. *hora veremos que sucede al reali4ar un Lpdate sobre nuestra tabla Clientes U!(A*' ./I'N*'S S'* I(2$.I*+IB$ W8'+' I( 2$8!$ Go S'/'.* 4 5+,1 !'(I(,S

numero clienteIid %%%%%%%%%%% %%%%%%%%%% ? 3LLL 2 M<0DMSM;$ ... ...


0omo podemos observar el reali4ar un Lpdate sobre el campo llave de la tabla Clientes, en nuestra tabla hi,a (Pedidos+ se ha cambiado al valor (efault del campo (RMicrosoftS+

Conclusiones: Sin nin#una duda que el a#re#ado de estas dos (2+ nuevas funciones de (D< nos ayudaran considerablemente al momento de reali4ar nuestras relaciones padres / hi,os& que hasta la versi n 2000 reali4ar este mismo tipo de operatoria como hemos visto en los e,emplos era una tarea muy incomoda.

((L Triggers:
!n la versi n 2000 de MS SQL%Server solo dispon"amos de tri##ers ((esencadenadores+ (ML para las instrucciones <nsert / Lpdate y (elete. SQL 2005 incorpora un nuevo tipo de tri##ers llamados ((L $ri##ers& los cuales pueden tener efecto sobre las instrucciones ((L como por e,- 0D!*$! $*)L!. !n esta secci n veremos dos (2+ e,emplos sobre estos nuevos tipos de tri##ers& uno de ellos har una auditoria de instrucciones ((L y el otro no permitir la e,ecuci n de una instrucci n *L$!D $*)L!

US' A()'N*U+'W,+-S G, .+'A*' *+IGG'+ ((/_9 ,N (A*A&AS' 5,+ A/*'+_*A&/' AS +AIS'++,+($N, S' !U'(' A/*'+A+ *A&/AS 'N 'S*A &AS' (' (A*,S"$,9I,9) +,//&A.G,

!n este e,emplo hemos creado un tri##er ((L en la base de datos *dventureTor6s el cual impedir que se realicen operaciones *L$!D $*)L! sobre dicha base de datos. Si deseamos reali4ar la si#uiente operaci n recibiremos un error y no se reali4ara la misma.

US' A()'N*U+'W,+-S G, A/*'+ *A&/' !+,(U.*I,N"!+,(U.* A(( .,/U1NA )A+.8A+(9:) G,

*hora veremos un e,emplo donde usaremos un ((L tri##er para reali4ar auditorias ((L

US' A()'N*U+'W,+-S G, .+'A*' *A&/' ((/_AU(I* (/SN IN* N,* NU// I('N*I*7,!,S**I1' (A*'*I1' N,* NU//, ')'N**7!' S7SNA1' N,* NU//, /,GINNA1' S7SNA1' N,* NU//, ,&6'.*NA1' S7SNA1' N,* NU//,*A+G'*,&6'.*NA1' S7SNA1' N,* NU//) G, !l primer paso ha sido crear una tabla donde re#istraremos las auditorias ((L. .+'A*' *+IGG'+ ((/_D ,N (A*A&AS' 5,+ ((/_(A*A&AS'_/')'/_')'N*S AS ('./A+' 0) AS B1/ S'* 0) 2 ')'N*(A*A() INS'+* IN*, ((/_AU(I* (!,S**I1',')'N**7!',/,GINNA1',,&6'.*NA1', *A+G'*,&6'.*NA1') )A/U'S ( .AS*(0)"Luery($data(??!ost*ime)$) as varc#ar(D3)), .AS*(0)"Luery($data(??'vent*ype)$) as sysname), .AS*(0)"Luery($data(??/oFinName)$) as sysname), .AS*(0)"Luery($data(??,bGectName)$) as sysname), .AS*(0)"Luery($data(??*arFet,bGectName)$) as sysname)) G, !ste se#undo paso es el que #enera el tri##er ((L el cual re#istrara en nuestra tabla cada acontecimiento que suceda.

*hora solo nos resta por probar el funcionamiento del tri##er


.+'A*' *A&/' !! (I( IN*) G, S'/'.* 4 5+,1 ((/_AU(I*

Conclusiones: Los ((L tri##ers son una nueva herramienta muy poderosa de verdad& la cual nos permitir desde ahora poder tener control sobre las sentencias ((L como as" tambi'n poder reali4ar auditorias a las mismas. onc!usiones ,enera!es:
En este artculo hemos visto algunas de las novedades de Sql2005 en lo que respecta a TSQL. Aun quedan muchas otras uncionalidades por mostrar pero de!o indicar que esta nueva versi"n del popular motor de !ase de datos es mu# distinta a su antecesora incorporando muchas me$oras tanto para el desarrollador como as tam!i%n para los &'A. Autor( )a*imiliano Acotto )+, SQL Server macotto-sqlgurus.org

Вам также может понравиться