1. SQL Server 2005SQL Server 2005
Jordi RamblaJordi Rambla
CertiaCertia
Microsoft MVPMicrosoft MVP
jordi@ramblainf.comjordi@ramblainf.com
2. Yo (Jordi Rambla – jordi@ramblainf.com)Yo (Jordi Rambla – jordi@ramblainf.com)
Director técnico de CertiaDirector técnico de Certia
Consultor y profesor de Reporting y BIConsultor y profesor de Reporting y BI
Mentor Asociado de Solid Quality LearningMentor Asociado de Solid Quality Learning
IberoamericanaIberoamericana
MVP SQL ServerMVP SQL Server
Regional Director de MicrosoftRegional Director de Microsoft circacirca1997-20041997-2004
Consultor de P&P,XML, ES y WS en Ciclo .NET UOCConsultor de P&P,XML, ES y WS en Ciclo .NET UOC
Certia (http://certia.ramblainf.com)Certia (http://certia.ramblainf.com)
Es la marca de servicios de rambla informàticaEs la marca de servicios de rambla informàtica
Consultoría, formación y aplicaciones en BI y .NETConsultoría, formación y aplicaciones en BI y .NET
Trabajando en informática empresarial desde 1985Trabajando en informática empresarial desde 1985
3. More than just trainingMore than just training
Mentores Principales:Mentores Principales:
Itzik Ben-Gan, Kalen Delaney, Fernando G. Guerrero,Itzik Ben-Gan, Kalen Delaney, Fernando G. Guerrero,
Michael Hotek, Brian Moran , Ron TalmageMichael Hotek, Brian Moran , Ron Talmage
Iberoamericana:Iberoamericana:
Miguel Egea, Alejandro Leguízamo, Jesús López, PabloMiguel Egea, Alejandro Leguízamo, Jesús López, Pablo
Pelaez, Jordi Rambla, Eladio Rincón, Daniel Seara,Pelaez, Jordi Rambla, Eladio Rincón, Daniel Seara,
Guillermo Som, Antonio Soto, Adolfo WiernikGuillermo Som, Antonio Soto, Adolfo Wiernik
Ayudando a obtener lo mejor de SQLServer y .Net conAyudando a obtener lo mejor de SQLServer y .Net con
FormaciónFormación
ConsultoríaConsultoría
MentoringMentoring
4. Solid Quality Learning University SummitsSolid Quality Learning University Summits
¿Qué son los SQL University Summits?¿Qué son los SQL University Summits?
Intensos, avanzados, esencialmente útilesIntensos, avanzados, esencialmente útiles
Temarios aplicados a sistemas empresarialesTemarios aplicados a sistemas empresariales
Eventos formativos, no de marketingEventos formativos, no de marketing
2 grupos de sesiones simultáneas2 grupos de sesiones simultáneas
4 seminarios de día completo4 seminarios de día completo
9 mentores presentando 28 sesiones9 mentores presentando 28 sesiones
En castellanoEn castellano
¿Dónde?¿Dónde?
Madrid (del 25 al 29 de Abril del 2005)Madrid (del 25 al 29 de Abril del 2005)
Barcelona (¿2005?); tBarcelona (¿2005?); también en:ambién en:
Milán, Washington DC, Los Angeles, Chicago, Dallas, Monterrey, San Salvador,Milán, Washington DC, Los Angeles, Chicago, Dallas, Monterrey, San Salvador,
Singapore, Hong KongSingapore, Hong Kong
5. AgendaAgenda
¿Qué hay de nuevo?¿Qué hay de nuevo?
Integración con .NETIntegración con .NET
XML y SQL Server 2005XML y SQL Server 2005
Service BrokerService Broker
Mejoras en T-SQLMejoras en T-SQL
Mejoras en ADO.NETMejoras en ADO.NET
11. Integración con .NETIntegración con .NET
Alternativa a T-SQLAlternativa a T-SQL
FuncionesFunciones
definidas por eldefinidas por el
usuariousuario
ProcedimientosProcedimientos
almacenadosalmacenados
TriggersTriggers
Tipos definidosTipos definidos
por el usuariopor el usuario
AggregatesAggregates
T-SQLT-SQL
LenguajesLenguajes
.NET.NET
12. Integración con .NETIntegración con .NET
CreaciónCreación
Registro de assembliesRegistro de assemblies
Almacenados en la base de datosAlmacenados en la base de datos
CREATE ASSEMBLYCREATE ASSEMBLY NombreAssemblyNombreAssembly FROMFROM c:assembly.dllc:assembly.dllCREATE ASSEMBLYCREATE ASSEMBLY NombreAssemblyNombreAssembly FROMFROM c:assembly.dllc:assembly.dll
ReferenciasReferencias
Se almacenan automáticamenteSe almacenan automáticamente
Sólo dependencias que no estén en la GACSólo dependencias que no estén en la GAC
13. Integración con .NETIntegración con .NET
Creación (II)Creación (II)
Definición de:Definición de:
UDFs, procedimientos almacenados, triggersUDFs, procedimientos almacenados, triggers
Enlazando a función estática y públicaEnlazando a función estática y pública
UDTs, aggregatesUDTs, aggregates
Enlazando a claseEnlazando a clase
CREATE FUNCTIONCREATE FUNCTION NombreFuncionNombreFuncion () RETURNS int() RETURNS int
AS EXTERNAL NAMEAS EXTERNAL NAME NombreAssembly.[clase]:funcionNombreAssembly.[clase]:funcion
CREATE FUNCTIONCREATE FUNCTION NombreFuncionNombreFuncion () RETURNS int() RETURNS int
AS EXTERNAL NAMEAS EXTERNAL NAME NombreAssembly.[clase]:funcionNombreAssembly.[clase]:funcion
14. Integración con .NETIntegración con .NET
SeguridadSeguridad
CAS deja de tener validezCAS deja de tener validez
Tres nuevos niveles gestionados por SQLTres nuevos niveles gestionados por SQL
SafeSafe
ExternalExternal
UnsafeUnsafe
Validados al dar de alta el assemblyValidados al dar de alta el assembly
Ej. Type safe, finalizers, mutable statics…Ej. Type safe, finalizers, mutable statics…
Llamadas al BCL restringidasLlamadas al BCL restringidas
Nuevo atributo HostProtectionAttributeNuevo atributo HostProtectionAttribute
15. Integración con .NETIntegración con .NET
Acceso a datosAcceso a datos
Comunicación mediante SqlAccess.dllComunicación mediante SqlAccess.dll
System.Data.SqlSystem.Data.Sql
Proveedor ADO.NETProveedor ADO.NET inprocessinprocess
Acceso al contexto de la conexiónAcceso al contexto de la conexión
PipePipe
Estado servidorEstado servidor
Tablas triggersTablas triggers
PeticiónPetición
Cursores de servidorCursores de servidor
17. Documentación disponibleDocumentación disponible
Using CLR Integration in SQL Server 2005Using CLR Integration in SQL Server 2005
Balaji RathakrishnanBalaji Rathakrishnan
Christian KleinermanChristian Kleinerman
Brad RichardsBrad Richards
Ramachandran VenkateshRamachandran Venkatesh
Vineet RaoVineet Rao
Microsoft – Noviembre 2004 – 41 páginasMicrosoft – Noviembre 2004 – 41 páginas
http://msdn.microsoft.com/SQL/2005/2005Articles/default.aspx?http://msdn.microsoft.com/SQL/2005/2005Articles/default.aspx?
pull=/library/en-us/dnsql90/html/sqlclrguidance.asppull=/library/en-us/dnsql90/html/sqlclrguidance.asp
Managed Data Access Inside SQL Server withManaged Data Access Inside SQL Server with
ADO.NET and SQLCLRADO.NET and SQLCLR
Pablo CastroPablo Castro -- MicrosoftMicrosoft –– AbrilAbril 20020055 –– 2626 páginaspáginas
http://msdn.microsoft.com/library/default.asp?url=/library/en-http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/dnsql90/html/mandataaccess.aspus/dnsql90/html/mandataaccess.asp
19. XML y SQL Server 2005XML y SQL Server 2005
NovedadesNovedades
Tipo de dato XMLTipo de dato XML
Índices sobre campos XMLÍndices sobre campos XML
Gestión de esquemas XSDGestión de esquemas XSD
Consulta XQueryConsulta XQuery
Vistas XML (SQLXML)Vistas XML (SQLXML)
Mejoras en FOR XML y OPENXMLMejoras en FOR XML y OPENXML
20. XML y SQL Server 2005XML y SQL Server 2005
Nuevo tipo XMLNuevo tipo XML
Almacena documentos XMLAlmacena documentos XML
Puede utilizarse como cualquier otro tipoPuede utilizarse como cualquier otro tipo
Columnas, parámetros, retorno de funciones …Columnas, parámetros, retorno de funciones …
Validación well-formed y XSDValidación well-formed y XSD
Se guarda como un BLOB (b1)Se guarda como un BLOB (b1)
EscenariosEscenarios
Información complejaInformación compleja
Datos semiestructuradosDatos semiestructurados
Gestión documental (ej. e-mail), mensajería (SOAP)Gestión documental (ej. e-mail), mensajería (SOAP)
Intercambio de documentos (B2B, B2C…)Intercambio de documentos (B2B, B2C…)
21. XML y SQL Server 2005XML y SQL Server 2005
EsquemasEsquemas
Los campos XML pueden asociarse conLos campos XML pueden asociarse con
esquemasesquemas
CREATE TABLE Invoices(CREATE TABLE Invoices(
id INT PRIMARY KEY,id INT PRIMARY KEY,
factura XML(EsquemaFactura)factura XML(EsquemaFactura)
......
CREATE TABLE Invoices(CREATE TABLE Invoices(
id INT PRIMARY KEY,id INT PRIMARY KEY,
factura XML(EsquemaFactura)factura XML(EsquemaFactura)
......
Esquemas almacenados en la base de datosEsquemas almacenados en la base de datos
CREATE XML SCHEMA COLLECTION geocollCREATE XML SCHEMA COLLECTION geocoll
'<xs:schema ...'<xs:schema ...
targetNamespace=urn:geo>targetNamespace=urn:geo>
......
</xs:schema>'</xs:schema>'
CREATE XML SCHEMA COLLECTION geocollCREATE XML SCHEMA COLLECTION geocoll
'<xs:schema ...'<xs:schema ...
targetNamespace=urn:geo>targetNamespace=urn:geo>
......
</xs:schema>'</xs:schema>'
22. XML y SQL Server 2005XML y SQL Server 2005
Acceso a campos XMLAcceso a campos XML
XQUERYXQUERY
Standard W3C (Last Call Working Draft 4/4/2005)Standard W3C (Last Call Working Draft 4/4/2005)
Con extensiones para la actualizaciónCon extensiones para la actualización
Basado en XPathBasado en XPath
Mucha mayor riqueza para búsquedas complejasMucha mayor riqueza para búsquedas complejas
for $s in /doc[@id = 123]//sec[@num >= 3]for $s in /doc[@id = 123]//sec[@num >= 3]
return <topic>{data($s/heading)}</topic>return <topic>{data($s/heading)}</topic>
for $s in /doc[@id = 123]//sec[@num >= 3]for $s in /doc[@id = 123]//sec[@num >= 3]
return <topic>{data($s/heading)}</topic>return <topic>{data($s/heading)}</topic>
23. XML y SQL Server 2005XML y SQL Server 2005
XQuery desde T-SQLXQuery desde T-SQL
xml.query: devuelve un tipo XMLxml.query: devuelve un tipo XML
xml.exist: devuelve un booleano si hay resultadoxml.exist: devuelve un booleano si hay resultado
xml.value: devuelve un valor simple (escalar)xml.value: devuelve un valor simple (escalar)
xml.nodes: devuelve una tabla con una columnaxml.nodes: devuelve una tabla con una columna
xml.modifyxml.modify:: modifica el XMLmodifica el XML
SELECT id, xDoc.query(SELECT id, xDoc.query(
'for $s in /doc[@id = 123]//sec[@num >= 3]'for $s in /doc[@id = 123]//sec[@num >= 3]
return <topic>{data($s/heading)}</topic>')return <topic>{data($s/heading)}</topic>')
FROM docsFROM docs
SELECT id, xDoc.query(SELECT id, xDoc.query(
'for $s in /doc[@id = 123]//sec[@num >= 3]'for $s in /doc[@id = 123]//sec[@num >= 3]
return <topic>{data($s/heading)}</topic>')return <topic>{data($s/heading)}</topic>')
FROM docsFROM docs
24. XML y SQL Server 2005XML y SQL Server 2005
T-SQL desde XQueryT-SQL desde XQuery
sql:variablesql:variable
Acceso a variables T-SQL desde XqueryAcceso a variables T-SQL desde Xquery
sql:columnsql:column
Acceso a la columna a la que pertenece el XMLAcceso a la columna a la que pertenece el XML
select CV.query(select CV.query(
'for $elem in /CV/DatosPersonales'for $elem in /CV/DatosPersonales
returnreturn
<Nombre><Nombre>
{ sql:column("Nombre") }{ sql:column("Nombre") }
</Nombre> '</Nombre> '
) from DatosPersonales) from DatosPersonales
select CV.query(select CV.query(
'for $elem in /CV/DatosPersonales'for $elem in /CV/DatosPersonales
returnreturn
<Nombre><Nombre>
{ sql:column("Nombre") }{ sql:column("Nombre") }
</Nombre> '</Nombre> '
) from DatosPersonales) from DatosPersonales
25. XML y SQL Server 2005XML y SQL Server 2005
ÍndicesÍndices
Pueden definirse índices en columnas XMLPueden definirse índices en columnas XML
Aceleran las sentencias XQueryAceleran las sentencias XQuery
Cuatro tiposCuatro tipos
PRIMARY: Indexa los nodosPRIMARY: Indexa los nodos
PATH: Indexa por path de nodoPATH: Indexa por path de nodo
VALUE: Indexa por contenido de nodosVALUE: Indexa por contenido de nodos
PROPERTY: Indexa por nodos comunesPROPERTY: Indexa por nodos comunes
27. Documentación disponibleDocumentación disponible
XML Options in Microsoft SQL ServerXML Options in Microsoft SQL Server
20052005
Microsoft – Enero 2005 – 34 páginasMicrosoft – Enero 2005 – 34 páginas
http://msdn.microsoft.com/SQL/2005/2005Articles/default.aspx?http://msdn.microsoft.com/SQL/2005/2005Articles/default.aspx?
pull=/library/en-us/dnsql90/html/sql2k5xmloptions.asppull=/library/en-us/dnsql90/html/sql2k5xmloptions.asp
XML Support in Microsoft SQL ServerXML Support in Microsoft SQL Server
20052005
Shankar Pal, Mark Fussell, Irwin DolobowskyShankar Pal, Mark Fussell, Irwin Dolobowsky
Microsoft Corporation – Mayo 2004 – 39 páginasMicrosoft Corporation – Mayo 2004 – 39 páginas
http://msdn.microsoft.com/SQL/2005/2005Articles/default.aspx?http://msdn.microsoft.com/SQL/2005/2005Articles/default.aspx?
pull=/library/en-us/dnsql90/html/sql2k5xml.asppull=/library/en-us/dnsql90/html/sql2k5xml.asp
29. Service BrokerService Broker
¿Qué es?¿Qué es?
Sistema de mensajería asíncronaSistema de mensajería asíncrona
Implementado 100% en SQL ServerImplementado 100% en SQL Server
DestinatariosDestinatarios
La misma BBDDLa misma BBDD
Otra BBDD en la misma instancia o en otra instanciaOtra BBDD en la misma instancia o en otra instancia
Otro servidor SQL Server remotoOtro servidor SQL Server remoto
IncluyeIncluye
Nuevos objetosNuevos objetos
Nuevas sentencias T-SQLNuevas sentencias T-SQL
Utilizado internamente en SQL Server 2005Utilizado internamente en SQL Server 2005
Query NotificationsQuery Notifications
Event NotificationsEvent Notifications
Lo pueden usar otras aplicacionesLo pueden usar otras aplicaciones
30. Service BrokerService Broker
Y con éste ya van 4…Y con éste ya van 4…
MSMQMSMQ
Necesita usar DTC para transacciones con BDNecesita usar DTC para transacciones con BD
No garantiza ordenamiento de mensajesNo garantiza ordenamiento de mensajes
Biztalk messagingBiztalk messaging
Incorpora orquestaciónIncorpora orquestación
Automatiza procesoAutomatiza proceso
Indigo messagingIndigo messaging
Es interoperableEs interoperable
31. Mensajería asíncronaMensajería asíncrona
(¿Cómo dice?)(¿Cómo dice?)
Usamos una cola para:Usamos una cola para:
Que el proceso deje unQue el proceso deje un mensajemensaje en la cola yen la cola y
recupere inmediatamente el control del procesorecupere inmediatamente el control del proceso
((asincroníaasincronía))
El software de gestión de colas se encarga deEl software de gestión de colas se encarga de
gestionar la entrega de ese mensaje en su destinogestionar la entrega de ese mensaje en su destino
Con todos los matices adicionales (persistencia, garantía,Con todos los matices adicionales (persistencia, garantía,
secuencia, entrega única, transacción, trazabilidad…)secuencia, entrega única, transacción, trazabilidad…)
Esas son las diferencias con un socket TCPEsas son las diferencias con un socket TCP
El receptor puede procesar los mensajes a suEl receptor puede procesar los mensajes a su
conveniencia (con/sin prioridad, p.e.)conveniencia (con/sin prioridad, p.e.)
32. Mensajería asíncronaMensajería asíncrona
(¿Dónde está el truco?)(¿Dónde está el truco?)
Es necesario disponer del software cliente de laEs necesario disponer del software cliente de la
cola y de un servidorcola y de un servidor
Es necesario “diseñar/definir” una serie deEs necesario “diseñar/definir” una serie de
mensajes y de diálogos entre emisores ymensajes y de diálogos entre emisores y
receptoresreceptores
Si se utiliza en muchas aplicacionesSi se utiliza en muchas aplicaciones
Definimos un “canal” para cada cola (muchas)Definimos un “canal” para cada cola (muchas)
Mezclamos varias comunicaciones en una mismaMezclamos varias comunicaciones en una misma
cola (control)cola (control)
En algunos aspectos es similar a una conexiónEn algunos aspectos es similar a una conexión
a la BBDD (abrir/cerrar, coste, estado, …)a la BBDD (abrir/cerrar, coste, estado, …)
33. Service BrokerService Broker
MensajesMensajes
Unidad de comunicaciónUnidad de comunicación
Tres tiposTres tipos
BinariosBinarios
CabeceraCabecera
XML (tipados o sin tipar)XML (tipados o sin tipar)
CREATE MESSAGE TYPECREATE MESSAGE TYPE
[http://www.company.com/messages/Invoice][http://www.company.com/messages/Invoice]
VALIDATION = VALID_XMLVALIDATION = VALID_XML
WITH SCHEMA COLLECTION invoice_xsdWITH SCHEMA COLLECTION invoice_xsd
CREATE MESSAGE TYPECREATE MESSAGE TYPE
[http://www.company.com/messages/Invoice][http://www.company.com/messages/Invoice]
VALIDATION = VALID_XMLVALIDATION = VALID_XML
WITH SCHEMA COLLECTION invoice_xsdWITH SCHEMA COLLECTION invoice_xsd
34. Service BrokerService Broker
ContratosContratos
Define los mensajes que se puedenDefine los mensajes que se pueden
intercambiarintercambiar
CREATE CONTRACTCREATE CONTRACT
[//company.com/Expenses/ExpenseSubmission][//company.com/Expenses/ExpenseSubmission]
((
[//company.com/Expenses/SubmitExpense][//company.com/Expenses/SubmitExpense]
SENT BY INITIATOR,SENT BY INITIATOR,
[//company.com/Expenses/ApprovedOrDenied][//company.com/Expenses/ApprovedOrDenied]
SENT BY TARGET,SENT BY TARGET,
[//company.com/Expenses/ExpenseReimbursed][//company.com/Expenses/ExpenseReimbursed]
SENT BY TARGETSENT BY TARGET
))
CREATE CONTRACTCREATE CONTRACT
[//company.com/Expenses/ExpenseSubmission][//company.com/Expenses/ExpenseSubmission]
((
[//company.com/Expenses/SubmitExpense][//company.com/Expenses/SubmitExpense]
SENT BY INITIATOR,SENT BY INITIATOR,
[//company.com/Expenses/ApprovedOrDenied][//company.com/Expenses/ApprovedOrDenied]
SENT BY TARGET,SENT BY TARGET,
[//company.com/Expenses/ExpenseReimbursed][//company.com/Expenses/ExpenseReimbursed]
SENT BY TARGETSENT BY TARGET
))
35. Service BrokerService Broker
ColasColas
Puntos de entrada a los serviciosPuntos de entrada a los servicios
Pueden leerse desde T-SQLPueden leerse desde T-SQL
Pueden llamar a un procedimientoPueden llamar a un procedimiento
CREATE QUEUE ExpenseQueueCCREATE QUEUE ExpenseQueueC
WITH STATUS = ONWITH STATUS = ON
ACTIVATION (ACTIVATION (
PROCEDURE_NAME = expense_activation,PROCEDURE_NAME = expense_activation,
MAX_QUEUE_READERS = 5,MAX_QUEUE_READERS = 5,
EXECUTE_AS USER = 'sa')EXECUTE_AS USER = 'sa')
CREATE QUEUE ExpenseQueueCCREATE QUEUE ExpenseQueueC
WITH STATUS = ONWITH STATUS = ON
ACTIVATION (ACTIVATION (
PROCEDURE_NAME = expense_activation,PROCEDURE_NAME = expense_activation,
MAX_QUEUE_READERS = 5,MAX_QUEUE_READERS = 5,
EXECUTE_AS USER = 'sa')EXECUTE_AS USER = 'sa')
36. Service BrokerService Broker
ServiciosServicios
Funcionalidad expuesta en las colasFuncionalidad expuesta en las colas
Compuesto porCompuesto por
Una colaUna cola
Varios contratosVarios contratos
CREATE SERVICE [//company.com/Expenses]CREATE SERVICE [//company.com/Expenses]
ON ExpenseQueueON ExpenseQueue
([//company.com/Expenses/ExpenseSubmission],([//company.com/Expenses/ExpenseSubmission],
[//company.com/Expenses/ExpenseProcessing])[//company.com/Expenses/ExpenseProcessing])
CREATE SERVICE [//company.com/Expenses]CREATE SERVICE [//company.com/Expenses]
ON ExpenseQueueON ExpenseQueue
([//company.com/Expenses/ExpenseSubmission],([//company.com/Expenses/ExpenseSubmission],
[//company.com/Expenses/ExpenseProcessing])[//company.com/Expenses/ExpenseProcessing])
37. Service BrokerService Broker
Envío de mensajesEnvío de mensajes
1.- Creación del diálogo1.- Creación del diálogo
Un diálogo ordena y correlaciona los mensajesUn diálogo ordena y correlaciona los mensajes
2.- Envío del mensaje2.- Envío del mensaje
Mediante comando SENDMediante comando SEND
SET @ExpenseReport = “<report>…</report>”;SET @ExpenseReport = “<report>…</report>”;
BEGIN DIALOG @dialog_handleBEGIN DIALOG @dialog_handle
FROM SERVICE [//Adventure-Works.com/Expenses/ExpenseClient]FROM SERVICE [//Adventure-Works.com/Expenses/ExpenseClient]
TO SERVICE '//Adventure-Works.com/Expenses'TO SERVICE '//Adventure-Works.com/Expenses'
ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseProcessing] ;ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseProcessing] ;
SEND ON CONVERSATION @dialog_handleSEND ON CONVERSATION @dialog_handle
MESSAGE TYPE [//Adventure-Works.com/Expenses/SubmitExpense]MESSAGE TYPE [//Adventure-Works.com/Expenses/SubmitExpense]
(@ExpenseReport) ;(@ExpenseReport) ;
SET @ExpenseReport = “<report>…</report>”;SET @ExpenseReport = “<report>…</report>”;
BEGIN DIALOG @dialog_handleBEGIN DIALOG @dialog_handle
FROM SERVICE [//Adventure-Works.com/Expenses/ExpenseClient]FROM SERVICE [//Adventure-Works.com/Expenses/ExpenseClient]
TO SERVICE '//Adventure-Works.com/Expenses'TO SERVICE '//Adventure-Works.com/Expenses'
ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseProcessing] ;ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseProcessing] ;
SEND ON CONVERSATION @dialog_handleSEND ON CONVERSATION @dialog_handle
MESSAGE TYPE [//Adventure-Works.com/Expenses/SubmitExpense]MESSAGE TYPE [//Adventure-Works.com/Expenses/SubmitExpense]
(@ExpenseReport) ;(@ExpenseReport) ;
38. Service BrokerService Broker
Recepción de mensajesRecepción de mensajes
Comando RECEIVEComando RECEIVE
Especifica la cola y el diálogoEspecifica la cola y el diálogo
Es posible quedar a la espera con WAITFOREs posible quedar a la espera con WAITFOR
WAITFOR (WAITFOR (
RECEIVE *RECEIVE *
FROM ExpenseQueue),FROM ExpenseQueue),
TIMEOUT 60000TIMEOUT 60000
WAITFOR (WAITFOR (
RECEIVE *RECEIVE *
FROM ExpenseQueue),FROM ExpenseQueue),
TIMEOUT 60000TIMEOUT 60000
40. Documentación disponibleDocumentación disponible
An Introduction to SQL Server ServiceAn Introduction to SQL Server Service
BrokerBroker
Roger Wolter – Julio 2004 –Roger Wolter – Julio 2004 – 110 páginas0 páginas
Kit de Recursos SQL Server 2005 Beta 2Kit de Recursos SQL Server 2005 Beta 2
Conceptos básicosConceptos básicos
A First Look at SQL Server 2005 ServiceA First Look at SQL Server 2005 Service
BrokerBroker
Roger Wolter – Julio 2004 – 20 páginasRoger Wolter – Julio 2004 – 20 páginas
http://msdn.microsoft.com/SQL/2005/2005Articles/default.aspx?pull=/libhttp://msdn.microsoft.com/SQL/2005/2005Articles/default.aspx?pull=/lib
Conceptos y ejemplos de códigoConceptos y ejemplos de código
42. Mejoras en T-SQLMejoras en T-SQL
Control de excepcionesControl de excepciones
Se acabó el acceso a @@ERRORSe acabó el acceso a @@ERROR
Bloques TRY…CATCHBloques TRY…CATCH
AnidablesAnidables
Nuevas funciones disponibles en el CATCHNuevas funciones disponibles en el CATCH
ERROR_NUMBER, ERROR_MESSAGE…ERROR_NUMBER, ERROR_MESSAGE…
BEGIN TRYBEGIN TRY
SELECT * FROM authorsSELECT * FROM authors
END TRYEND TRY
BEGIN CATCHBEGIN CATCH
SELECT ERROR_NUMBER()SELECT ERROR_NUMBER()
END CATCHEND CATCH
BEGIN TRYBEGIN TRY
SELECT * FROM authorsSELECT * FROM authors
END TRYEND TRY
BEGIN CATCHBEGIN CATCH
SELECT ERROR_NUMBER()SELECT ERROR_NUMBER()
END CATCHEND CATCH
43. Mejoras en T-SQLMejoras en T-SQL
Common Table ExpressionsCommon Table Expressions
Resultset temporalResultset temporal
Sólo vive en la sentencia actualSólo vive en la sentencia actual
WITH mid ASWITH mid AS
((
SELECT (MAX(ListPrice) + MIN(ListPrice))/2 as midvalSELECT (MAX(ListPrice) + MIN(ListPrice))/2 as midval
from production.productfrom production.product
))
SELECT * FROM Production.Product, midSELECT * FROM Production.Product, mid
WHERE ListPrice > midvalWHERE ListPrice > midval
WITH mid ASWITH mid AS
((
SELECT (MAX(ListPrice) + MIN(ListPrice))/2 as midvalSELECT (MAX(ListPrice) + MIN(ListPrice))/2 as midval
from production.productfrom production.product
))
SELECT * FROM Production.Product, midSELECT * FROM Production.Product, mid
WHERE ListPrice > midvalWHERE ListPrice > midval
Mejor que las subqueries si hay varias igualesMejor que las subqueries si hay varias iguales
Admite recursividadAdmite recursividad
44. Mejoras en T-SQLMejoras en T-SQL
RankingRanking
Añade una columna basada en rankingsAñade una columna basada en rankings
ROW_NUMBERROW_NUMBER
RANKRANK
DENSE_RANKDENSE_RANK
NTILE (n)NTILE (n)
Pueden agruparse en particionesPueden agruparse en particiones
PARTITION BYPARTITION BY
45. Mejoras en T-SQLMejoras en T-SQL
Ranking (2)Ranking (2)
SELECT orderid, customerid,SELECT orderid, customerid,
ROW_NUMBER() OVER(ORDER BY customerid) AS num,ROW_NUMBER() OVER(ORDER BY customerid) AS num,
RANK() OVER(ORDER BY customerid) AS [rank],RANK() OVER(ORDER BY customerid) AS [rank],
DENSE_RANK() OVER(ORDER BY customerid) AS [denserank],DENSE_RANK() OVER(ORDER BY customerid) AS [denserank],
NTILE(5) OVER(ORDER BY customerid) AS ntile5NTILE(5) OVER(ORDER BY customerid) AS ntile5
FROM ordersFROM orders
SELECT orderid, customerid,SELECT orderid, customerid,
ROW_NUMBER() OVER(ORDER BY customerid) AS num,ROW_NUMBER() OVER(ORDER BY customerid) AS num,
RANK() OVER(ORDER BY customerid) AS [rank],RANK() OVER(ORDER BY customerid) AS [rank],
DENSE_RANK() OVER(ORDER BY customerid) AS [denserank],DENSE_RANK() OVER(ORDER BY customerid) AS [denserank],
NTILE(5) OVER(ORDER BY customerid) AS ntile5NTILE(5) OVER(ORDER BY customerid) AS ntile5
FROM ordersFROM orders
orderid customerid num rank denserank tile5orderid customerid num rank denserank tile5
----------- ---------- ------ ------ --------- ----------------- ---------- ------ ------ --------- ------
10308 ANATR 1 1 1 110308 ANATR 1 1 1 1
10365 ANTON 2 2 2 110365 ANTON 2 2 2 1
10355 AROUT 3 3 3 210355 AROUT 3 3 3 2
10383 AROUT 4 3 3 210383 AROUT 4 3 3 2
10278 BERGS 5 5 4 310278 BERGS 5 5 4 3
10280 BERGS 6 5 4 310280 BERGS 6 5 4 3
10384 BERGS 7 5 4 410384 BERGS 7 5 4 4
10265 BLONP 8 8 5 410265 BLONP 8 8 5 4
10297 BLONP 9 8 5 510297 BLONP 9 8 5 5
10360 BLONP 10 8 5 510360 BLONP 10 8 5 5
orderid customerid num rank denserank tile5orderid customerid num rank denserank tile5
----------- ---------- ------ ------ --------- ----------------- ---------- ------ ------ --------- ------
10308 ANATR 1 1 1 110308 ANATR 1 1 1 1
10365 ANTON 2 2 2 110365 ANTON 2 2 2 1
10355 AROUT 3 3 3 210355 AROUT 3 3 3 2
10383 AROUT 4 3 3 210383 AROUT 4 3 3 2
10278 BERGS 5 5 4 310278 BERGS 5 5 4 3
10280 BERGS 6 5 4 310280 BERGS 6 5 4 3
10384 BERGS 7 5 4 410384 BERGS 7 5 4 4
10265 BLONP 8 8 5 410265 BLONP 8 8 5 4
10297 BLONP 9 8 5 510297 BLONP 9 8 5 5
10360 BLONP 10 8 5 510360 BLONP 10 8 5 5
46. Mejoras en T-SQLMejoras en T-SQL
OtrasOtras
PivotPivot
Convierte filas a columnasConvierte filas a columnas
OUTPUTOUTPUT
Permite especificar una salida a sentencias dePermite especificar una salida a sentencias de
actualización distinta al número de filasactualización distinta al número de filas
Ej. Registros borrados, identities, etc.Ej. Registros borrados, identities, etc.
Aislamiento snapshotAislamiento snapshot
Escritores no bloquean a lectoresEscritores no bloquean a lectores
47. Mejoras en T-SQLMejoras en T-SQL
Ranking (2)Ranking (2)
DECLARE @DeletedOrders TABLEDECLARE @DeletedOrders TABLE
( orderid INT,( orderid INT,
orderdate DATETIME,orderdate DATETIME,
empid INT,empid INT,
custid VARCHAR(5),custid VARCHAR(5),
qty INT )qty INT )
WHILE 1=1WHILE 1=1
BEGINBEGIN
BEGIN TRANBEGIN TRAN
DELETE TOP(5000) FROM OrdersDELETE TOP(5000) FROM Orders
OUTPUT deleted.* INTO @DeletedOrdersOUTPUT deleted.* INTO @DeletedOrders
WHERE orderdate < '20030101'WHERE orderdate < '20030101'
INSERT INTO OrdersArchiveINSERT INTO OrdersArchive
SELECT * FROM @DeletedOrdersSELECT * FROM @DeletedOrders
COMMIT TRANCOMMIT TRAN
DELETE FROM @DeletedOrdersDELETE FROM @DeletedOrders
IF @@rowcount < 5000IF @@rowcount < 5000
BREAKBREAK
ENDEND
DECLARE @DeletedOrders TABLEDECLARE @DeletedOrders TABLE
( orderid INT,( orderid INT,
orderdate DATETIME,orderdate DATETIME,
empid INT,empid INT,
custid VARCHAR(5),custid VARCHAR(5),
qty INT )qty INT )
WHILE 1=1WHILE 1=1
BEGINBEGIN
BEGIN TRANBEGIN TRAN
DELETE TOP(5000) FROM OrdersDELETE TOP(5000) FROM Orders
OUTPUT deleted.* INTO @DeletedOrdersOUTPUT deleted.* INTO @DeletedOrders
WHERE orderdate < '20030101'WHERE orderdate < '20030101'
INSERT INTO OrdersArchiveINSERT INTO OrdersArchive
SELECT * FROM @DeletedOrdersSELECT * FROM @DeletedOrders
COMMIT TRANCOMMIT TRAN
DELETE FROM @DeletedOrdersDELETE FROM @DeletedOrders
IF @@rowcount < 5000IF @@rowcount < 5000
BREAKBREAK
ENDEND
48. Mejoras en T-SQLMejoras en T-SQL
Otras (2)Otras (2)
DRIDRI
SET NULL y SET DEFAULTSET NULL y SET DEFAULT
(…)(…)
CONSTRAINT FK_Orders_CustomersCONSTRAINT FK_Orders_Customers
FOREIGN KEY(customerid)FOREIGN KEY(customerid)
REFERENCES Customers(customerid)REFERENCES Customers(customerid)
ON DELETE SET NULLON DELETE SET NULL
ON UPDATE SET DEFAULTON UPDATE SET DEFAULT
(…)(…)
CONSTRAINT FK_Orders_CustomersCONSTRAINT FK_Orders_Customers
FOREIGN KEY(customerid)FOREIGN KEY(customerid)
REFERENCES Customers(customerid)REFERENCES Customers(customerid)
ON DELETE SET NULLON DELETE SET NULL
ON UPDATE SET DEFAULTON UPDATE SET DEFAULT
TOPTOP
Permite expresionesPermite expresiones
También para actualizacionesTambién para actualizaciones
52. Mejoras en ADO.NETMejoras en ADO.NET
MARSMARS
Múltiples resultsets y transacciones simultáneasMúltiples resultsets y transacciones simultáneas
por conexiónpor conexión
SqlCommand cmd = new SqlCommand("select * fromSqlCommand cmd = new SqlCommand("select * from
authors",conn);authors",conn);
SqlCommand cmd2 = new SqlCommand("select * fromSqlCommand cmd2 = new SqlCommand("select * from
jobs",conn);jobs",conn);
conn.Open();conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();SqlDataReader rdr = cmd.ExecuteReader();
SqlDataReader rdr2 = cmd2.ExecuteReader();SqlDataReader rdr2 = cmd2.ExecuteReader();
rdr2.Read();rdr2.Read();
rdr.Read();rdr.Read();
SqlCommand cmd = new SqlCommand("select * fromSqlCommand cmd = new SqlCommand("select * from
authors",conn);authors",conn);
SqlCommand cmd2 = new SqlCommand("select * fromSqlCommand cmd2 = new SqlCommand("select * from
jobs",conn);jobs",conn);
conn.Open();conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();SqlDataReader rdr = cmd.ExecuteReader();
SqlDataReader rdr2 = cmd2.ExecuteReader();SqlDataReader rdr2 = cmd2.ExecuteReader();
rdr2.Read();rdr2.Read();
rdr.Read();rdr.Read();
53. Mejoras en ADO.NETMejoras en ADO.NET
Dependencias SQLDependencias SQL
Notificación cuando cambia unNotificación cuando cambia un resultsetresultset
Útil para invalidar caché o vistasÚtil para invalidar caché o vistas
Basado en Service BrokerBasado en Service Broker
SqlNotificationRequestSqlNotificationRequest
Recibe un objeto comando y un servicioRecibe un objeto comando y un servicio
Envía un mensaje al servicio cuando cambia elEnvía un mensaje al servicio cuando cambia el resultsetresultset
SqlDependencySqlDependency
Abstrae el Service BrokerAbstrae el Service Broker
Evento OnChangedEvento OnChanged
55. Documentación disponibleDocumentación disponible
Multiple Active Result Sets (MARS) in SQLMultiple Active Result Sets (MARS) in SQL
Server 2005Server 2005
Christian KleinermanChristian Kleinerman -- MicrosoftMicrosoft –– OctubreOctubre 20020044 –– 119 páginas9 páginas
http://msdn.microsoft.com/library/default.asp?url=/library/en-http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/dnsql90/html/MARSinSQL05.aspus/dnsql90/html/MARSinSQL05.asp
ADO.NET and System.Xml v.2.0--The BetaADO.NET and System.Xml v.2.0--The Beta
Version 2ªedVersion 2ªed
Alex Homer, David Sussman, Mark FussellAlex Homer, David Sussman, Mark Fussell
Addison WesleyAddison Wesley –– MarzoMarzo 20020055 –– 560560 páginaspáginas (cap.muestra – 38 págs.)(cap.muestra – 38 págs.)
http://www.awprofessional.com/content/images/0321247124/samplechahttp://www.awprofessional.com/content/images/0321247124/samplecha
http://www.daveandal.net/books/7124/http://www.daveandal.net/books/7124/ (código)(código)
56. Mejoras en ADO.NETMejoras en ADO.NET
TransaccionesTransacciones
System.TransactionsSystem.Transactions
API manejada para definir transaccionesAPI manejada para definir transacciones
Sin EnterpriseServices (COM+)Sin EnterpriseServices (COM+)
PromotablePromotable
Comienza como local (10 ms)Comienza como local (10 ms)
Sigue local en accesos a SQL Server 2005Sigue local en accesos a SQL Server 2005
Sólo se promueve a DTC siSólo se promueve a DTC si
Se accede a SQL Server 2000, MSMQ, Oracle…Se accede a SQL Server 2000, MSMQ, Oracle…
Se acceden a dos SQL Server 2005Se acceden a dos SQL Server 2005
57. Mejoras en ADO.NETMejoras en ADO.NET
Transacciones (2)Transacciones (2)
using (TransactionScope ts = new TransactionScope())using (TransactionScope ts = new TransactionScope())
{{
SqlConnection conn1 = new SqlConnection(SqlConnection conn1 = new SqlConnection(
"server=.;integrated security=sspi;database=pubs"))"server=.;integrated security=sspi;database=pubs"))
// Local tx si SQL 2005, si no distribuida// Local tx si SQL 2005, si no distribuida
conn1.Open();conn1.Open();
SqlCommand cmd1 = new SqlCommand(SqlCommand cmd1 = new SqlCommand(
"INSERT jobs 'job1', 10, 10", conn1);"INSERT jobs 'job1', 10, 10", conn1);
cmd1.ExecuteNonQuery();cmd1.ExecuteNonQuery();
SqlConnection conn2 = new SqlConnection(SqlConnection conn2 = new SqlConnection(
"server=other;integrated security=sspi;database=pubs"))"server=other;integrated security=sspi;database=pubs"))
// promueve a distribuida// promueve a distribuida
conn2.Open();conn2.Open();
SqlCommand cmd2 = new SqlCommand(SqlCommand cmd2 = new SqlCommand(
"INSERT jobs 'job2', 10, 10", conn2);"INSERT jobs 'job2', 10, 10", conn2);
cmd2.ExecuteNonQuery();cmd2.ExecuteNonQuery();
ts.Complete(); // commit transactionts.Complete(); // commit transaction
}}
using (TransactionScope ts = new TransactionScope())using (TransactionScope ts = new TransactionScope())
{{
SqlConnection conn1 = new SqlConnection(SqlConnection conn1 = new SqlConnection(
"server=.;integrated security=sspi;database=pubs"))"server=.;integrated security=sspi;database=pubs"))
// Local tx si SQL 2005, si no distribuida// Local tx si SQL 2005, si no distribuida
conn1.Open();conn1.Open();
SqlCommand cmd1 = new SqlCommand(SqlCommand cmd1 = new SqlCommand(
"INSERT jobs 'job1', 10, 10", conn1);"INSERT jobs 'job1', 10, 10", conn1);
cmd1.ExecuteNonQuery();cmd1.ExecuteNonQuery();
SqlConnection conn2 = new SqlConnection(SqlConnection conn2 = new SqlConnection(
"server=other;integrated security=sspi;database=pubs"))"server=other;integrated security=sspi;database=pubs"))
// promueve a distribuida// promueve a distribuida
conn2.Open();conn2.Open();
SqlCommand cmd2 = new SqlCommand(SqlCommand cmd2 = new SqlCommand(
"INSERT jobs 'job2', 10, 10", conn2);"INSERT jobs 'job2', 10, 10", conn2);
cmd2.ExecuteNonQuery();cmd2.ExecuteNonQuery();
ts.Complete(); // commit transactionts.Complete(); // commit transaction
}}