What’s new in SQL Server 2008? Table-value parameters

Otra de las novedades de T-SQL son parámetros «Table-value».


Este tipo de parámetros permite enviar múltiples filas de datos a una sentencias T-SQL, a un procedimiento almacenado o a una función, sin utilizar tablas temporales ni múltiples parámetros.


Este tipo de parámetros ofrecen un mejor rendimiento y flexibilidad que las tablas temporales para pasar una lista de parámetros.


Beneficios



  • Do not acquire locks for the initial population of data from a client.

  • Do not cause a statement to recompile.

  • Provide a simple programming model.

  • Enable you to include complex business logic in a single routine.

  • Reduce round trips to the server.

  • Can have a table structure of different cardinality.

  • Are strongly typed.

  • Enable the client to specify sort order and unique keys.

Restricciones



  • SQL Server does not maintain statistics on columns of table-valued parameters.

  • Table-valued parameters must be passed as input READONLY parameters to Transact-SQL routines. You cannot perform DML operations such as UPDATE, DELETE, or INSERT on a table-valued parameter in the body of a routine.

  • You cannot use a table-valued parameter as target of a SELECT INTO or INSERT EXEC statement. A table-valued parameter can be in the FROM clause of SELECT INTO or in the INSERT EXEC string or stored-procedure.

Ejemplo


USE AdventureWorks;


GO


/* Crear el tipo tabla. */


CREATE TYPE LocationTableType AS TABLE


(LocationName VARCHAR(50), CostRate INT);


GO


/*Crear un procedimiento almacenado que recibe el parámetro tabla.*/


CREATE PROCEDURE usp_InsertProductionLocation


@TVP LocationTableType READONLY


AS


SET NOCOUNT ON


INSERT INTO [AdventureWorks].[Production].[Location]


([Name], [CostRate], [Availability], [ModifiedDate])


SELECT *, 0, GETDATE()


FROM @TVP;


GO


/* Declarar variable de tipo tabla */


DECLARE @LocationTVP AS LocationTableType;


/* Añadir datos al tipo tabla */


INSERT INTO @LocationTVP (LocationName, CostRate)


SELECT [Name], 0.00


FROM


[AdventureWorks].[Person].[StateProvince];


/* Pass the table variable data to a stored procedure. */


EXEC usp_InsertProductionLocation @LocationTVP;


GO

What’s new in SQL Server 2008? MERGE

Una de las novedades que trae SQL Server 2008 respecto a T-SQL es la sentencia MERGE.


Permite seleccionar una tabla origen y una tabla destino y una condición de unión entre las dos tablas. Además de esto permite especificar qué acciones se deben hacer cuando los elementos de una tabla coinciden o no coinciden. Por ejemplo, se puede querer hacer la unión de dos tablas. Si un registro está en las dos tablas actualizar la información pero si no está borrarlo.


La sintaxis es la siguiente: ( Sólo incluyo la parte más representativa para enseñar la funcionalidad. En la ayuda podéis encontrar la versión completa )


[ WITH <common_table_expression> [,…n] ]
MERGE
[ TOP ( expression ) [ PERCENT ] ]
[ INTO ] target_table [ [ AS ] table_alias ]
        [ WITH ( <merge_hint> ) ]
USING <table_source>
ON <search_condition>
[ WHEN MATCHED [ AND <search_condition> ]
        THEN <merge_matched> ]
[ WHEN [TARGET] NOT MATCHED [ AND <search_condition> ]
        THEN <merge_not_matched> ]
[ WHEN SOURCE NOT MATCHED [ AND <search_condition> ]
        THEN <merge_ matched> ]


Veamos un par de ejemplos y como no hay que reinventar la rueda, pongo un par de ejemplos de los books-online de SQL Server 2008, que considero que aclaran perfectamente su funcionamiento.


Ejemplo1:


Por ejemplo, un posible uso es para optimizar las operaciones de actualización y borrado de una determina tabla.


En este ejemplo de AdventureWorks se actualiza la tabla de inventario ( ProductInventory  ) en función de las órdenes de venta existentes ( SalesOrderDetail ). Se actualiza la columna Quantity, restando el número de ventas que se han hecho del producto en el día. Si el número de elementos es 0, se elimina la fila.


USE AdventureWorks;
GO
MERGE Production.ProductInventory AS pi
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail sod
    JOIN Sales.SalesOrderHeader soh
    ON sod.SalesOrderID = soh.SalesOrderID
    AND soh.OrderDate = GETDATE()
    GROUP BY ProductID) AS src (ProductID, OrderQty)
ON (pi.ProductID = src.ProductID)
WHEN MATCHED AND pi.Quantity – src.OrderQty <> 0
    THEN UPDATE SET pi.Quantity = pi.Quantity – src.OrderQty
WHEN MATCHED AND pi.Quantity – src.OrderQty = 0
    THEN DELETE;


Ejemplo2:


En este segundo ejemplo se utiliza para insertar, actualizar o borrar los datos de una tabla en función de una serie de condiciones.


MERGE Departments AS d
USING Departments_delta AS dd
ON (d.DeptID = dd.DeptID)
WHEN MATCHED AND d.Manager <> dd.Manager OR d.DeptName <> dd.DeptName
    THEN UPDATE SET d.Manager = dd.Manager, d.DeptName = dd.DeptName
WHEN NOT MATCHED THEN
    INSERT (DeptID, DeptName, Manager)
        VALUES (dd.DeptID, dd.DeptName, dd.Manager)
WHEN SOURCE NOT MATCHED THEN
    DELETE;

Artalde.NET : Desarrollo con SharePoint 2007

 


El próximo 21 de noviembre se celebrará en la universidad de Deusto el siguiente evento del grupo de usuarios del País Vasco.


Esta vez será Juanjo Olabarria el encargado de presentarnos las maravillas de SharePoint 2007.


Si estáis interesados podéis registraros aquí.



Agenda:


19:00 Registro
19:15 Desarrollo con SharePoint 2007


   1. Introducción a SharePoint 2007
   2. Preparar un entorno de desarrollo
   3. Tipos de soluciones
   4. CAML
   5. API SharePoint (SharePoint Object Model)
   6. Webparts
   7. SharePoint Webservices.

What’s new in SSRS 2008? Nuevas funcionalidades de procesamiento y renderización

Además de la nueva arquitectura que comentaba en un post anterior, SQL Server Reporting Services 2008 incluye más novedades en la parte de procesamiento y renderización de informes.


Debido a la nueva arquitectura que presenta y a la mejora en los procesos de renderización necesita menos memoria  para las operaciones de procesamiento y renderización.


SSRS 2008 incluirá una extensión de renderización para Office 2007, que por ejemplo, permite exportar a formato Word. Se mejorará la integración con Office Excel 2007 para soportar funcionalidades que hasta no se incluían y ofrecer una mayor fidelidad en el resultado de exportar un informe a excel.


Por el momento, en la versión CTP que tengo instalada sólo se puede exportar a formato Excel, WebArchive, PDF, tiff, XML y CSV.


Sobre algunos de los formatos que ya existían anteriormente se han hecho mejoras, como el soporte de subreports en la exportación a Excel o la mejora en exportación a csv para exportar sólo los datos y no una mezcla de datos y layout.


SSRS 2008 incluirá  una nueva versión del schema del RDL. El nuevo schema se modifica para adaptarse a las nuevas regiones de datos que presenta la nueva versión y para optimizar el procesamiento de los mismos.


Por ejemplo, existe una nueva región de datos llamada Tablix. Esta región es un grid flexible que soporte múltiples grupos de columnas y múltiples grupos de filas, que pueden organizarse de forma jerárquica. La región de datos Chart también ha sufrido también varios cambios que han provocado la actualización del formato del RDL, para mejorar las funcionalidades de esta región de datos.


Por la compatibilidad de los RDL no habrá que preocuparse. Por ejemplo, si con la herramienta stand-alone para el diseño de reportes ( stand-alone Report Designer ) se abre un RDL de la versión anterior se migrará automáticamente a la nueva versión y podrá publicarse sin problemas. 


Si queréis empezar a probar esta versión una forma muy sencilla es migrar y publicar algunos de los rdl que ya tengáis creados y así poder hacer las pruebas que consideréis.


Report Designer

UpdatePanel y controles de Validación

Tratando de usar controles de validación dentro de un UpdatePanel no conseguíamos que la validación funcionase…

Buscando este problema en Internet encontré que en otros blogs ( Sergio Tarrillo, Oscar Alvarez) de geeks ya se había mencionado este error. En los dos se hace referencia a otro post de Scott´s Gus llamado ASP.NET AJAX Validator, donde se hacía referencia al error y se daba una solución.

La solución implica incluir un dll dentro del directorio bin de la aplicación y la modificación de una parte del fichero de configuración.

Bueno, pues este tema ya no es necesario, porque existe un Hotfix del framework que soluciona el problema. Lo he probado y funciona, así que si tenéis el problema ya sabéis..

What’s new in SSRS 2008? Nueva arquitectura.

La versión 2008 de SQL Server Reporting Services se presenta como gran novedad una nueva arquitectura que elimina la dependencia con Internet Information Server. A partir de ahora ya no será necesario usar IIS para poder disponer de toda la funcionalidad de SSRS.

El servidor de reportes, report server, es un servicio windows, que hace host para los diferentes componentes que tiene la arquitectura; report manager, report server Web Service y las diferentes funcionalidades de procesamiento en background. Cada uno de estos componentes corre en dominios de aplicación diferentes.

Arquitectura

El objetivo que se busca unificando las diferentes funcionalidades dentro del mismo servicio es reducir las tareas de mantenimiento y configuración, ya que simplifica estas tareas al tener un único punto de configuración, a través de las herramientas de configuración de SQL Server.

A nivel de arquitectura, aunque se presente como un único servicio, los diferentes componentes se encuentran accesibles a través de URL, por HTTP, tal y como ocurre en la versión 2005. El servicio windows incluye un listener http, que implementa el protocolo http 1.1. Para poder ofrecer esta funcionalidad SSRS hace uso de las funcionalidades incluidas en la librería http.sys.

La nueva arquitectura presenta una capa de autenticación que permite autorizar todas las peticiones que llegan desde las aplicaciones cliente. Desde el fichero de configuración se puede establecer la autenticación que se desea; windows ( por defecto ), autenticación básica, formulario, autenticación personalizada o acceso anónimo.

El report manager, tal como se presentaba en la versión anterior, hace de front-end web del report server Web Service, que permite realizar labores de visualización y administración de reportes. ( Si SSRS se encuentra integrado con SharePoint el Report Manager no se encuentrará accesible )

SSRS ofrece funcionalidades de programaciones, subscripciones y entrega-envío de reportes como parte de los "procesamientos de background". Como se puede ver el diagrama, estos componentes poseen un módulo independiente de administración de la memoria y del método de autenticación.  SSRS ofrece una nueva funcionalidad de administración de memoria que permite administrar los umbrales de uso de memoria para las operaciones de background.

cfg

El profiler es nuestro amigo!

Para la aplicación para cual estoy trabajando hace poco estuvimos haciendo pruebas de rendimiento de cara a optimizarla.


Aunque anteriormente hemos utilizado otros profilers de otras empresas para este tipo de pruebas, por el tipo de aplicación que estábamos desarrollando esta vez nos decantamos por utilizar el profiler que viene con Visual Studio Team System.


Si soy sincero, debo decir que no tenía mucha confianza en que fuese muy bueno pero debo decir que me ha sorprendido gratamente. Es bastante sencillo de utilizar y sin «mucho esfuerzo» se pueden conseguir unos resultados verdaderamente buenos.


En nuestro caso nos ha permitido encontrar cuellos de botella que limitaban enormemente el rendimiento de la aplicación y con poco esfuerzo hemos sido capaces de mejorarlo…. Cuántas aplicaciones saldrán con rendimientos pésimos por no invertir en revisar el código con un profiler!


Por cierto, para estas pruebas de carga utilizamos la versión beta de Visual Studio 2008. Empezamos usando la versión 2005 pero finalmente nos decantamos por usar la nueva versión. En lo relativo a pruebas de carga vienen unas cuentas mejoras que os serán de gran utilidad, incluida la compatibilidad con aplicaciones ASP.NET Ajax. Así que si estáis pensando en hacer este tipo de pruebas os recomiendo usar la nueva versión de Visual Studio.


A modo de resumen los pasos que deben seguir son los siguientes:



  1. Copiar la carpeta del profiler que se instala con Visual Studio al equipo donde se encuentra la aplicación a instrumentalizar.

  2. Compilar la aplicación y copiarla, junto a los pdbs, al equipo donde se harán las pruebas.

  3. Y ahora en la máquina, desde el directorio del profiler que hemos copiado, preparamos la aplicación:


    1. VSPerfCLREnv /globalsampleon

    2. VSPerfCLREnv /clron

    3. VsPerfCmd /START:SAMPLE  /OUTPUT:<fichero.vsp> /ATTACH:<assembly>

  4. Lanzar la prueba de carga desde visual studio.

  5. Finalizar la prueba y la instrumentalización.


    1. VsPerfCmd /DETACH

    2. VsPerfCmd /SHUTDOWN

  6. Copiar el fichero «.vsp» en el directorio que tengan tus ficheros y los pdbs y lo abres con el visual studio.

  7. Y nada, a analizar los todos…..el resultado te da información interesante sobre tus assemblies, métodos y demás que se usan en el ejecución de tu aplicación.

Si la aplicación es ASP.NET a estos pasos que comento habría que añadirle algún otro que se explica perfectamente en Profiling of ASP.NET Applications


Para la versión 2008 del profiler me parece también interesante este post de Buck Hodges.

Lectura obligatoria: Peopleware





peopleware

Hace ya tiempo que leí este libro por recomendación de Rodrigo Corral. Rodrigo ya hizo una crítica del mismo, por lo que no voy a repetirme.


¿ Entonces por qué escribo este post? Pues sencillo, porque cada día que pasa me dio cuenta que este libro debería ser de lectura obligatoria ( no recomendada ) para todos los jefes de proyecto o responsables que tengan bajo su carga a personas. Por eso vuelvo a comentar, a riesgo de ser pesado,  lo bueno que me parece este libro…


Es impresionante comprobar cómo muchas de las cosas que se comentan en el libro, escrito hace más de 15 años, sigue siendo válidas a día de hoy.


Así que nada, si alguna vez estáis en la típica discusión de qué debe cumplir un jefe de proyecto ya tenéis un punto para comentar..haber leído Peopleware!!  ( y si encima hace caso a algunas de las cosas que se comentan sería la bomba ) y por supuesto, el que no lo lea, que no ejerza….:-)