Evento de Reporting Service 2008 y Sharepoint en Rosario

by 26. junio 2009 05:35

Como les comente en un post anterior, el día martes 23/6 he sido invitado por el MUG (Club de usuarios Microsoft) a disertar junto a mi amiga Silvina Pizzarulli sobre Sharepoint.

A mi por supuesto me toco mostrar SQL Server en WSS y MOSS pero sobre todo Reporting Service 2008 integrado y como se lo usa en la mayoría de las empresas a las cuales les brindo mis servicios.

La verdad que la pase muy pero muy bien, 4 horas de viaje a la ida (lo que dormí jeje), Rosario soleado y la vuelta fue un poco rápida para mi gusto ya que el Bus iba un tanto ligero jeje .

La charla se dio en la sede de la UIA la cual tiene un hermoso auditorio (nos han tratado muy bien por cierto).

Aquí dejo algunas fotos de la charla como así también la parte mas importante la comilona, esas picadas de achuras son Mortales (Gracias Roberto Pilon).

 

La verdad que siempre ir a rosario me gusta ya que tengo algunos amigos por esos pagos a los cuales fue un placer volver a ver nuevamente y compartir la charla y cena (Silvina Pizzarulli, Roberto Pilon, Clarisa Savio, Martin Comparetto, Oscar Turquet)

Tags:

Comunidad

Ejemplos y guía de Reporting Service 2008

by 26. junio 2009 02:06

Aquí les dejo un archivo comprimido con todo el material que yo utilizo y arme para las distintas conferencias que doy de Reporting Service 2008.

En el mismo encontraran un pdf donde se muestran desde los conceptos iniciales hasta los mas avanzando (teoría) y también ejemplos en los cuales hay (Tablas, matrices, Tablix, Indicadores Gauge, Consultas de saldos, uso de parámetros, imágenes, reportes que se vinculan entre si, etc.)

Para poder usar los ejemplos deberán restaurar la base de datos que viene en el RAR que no es ni mas ni menos que Adventureworks.

Estos ejemplos no fueron probados en Sql Express.

Tags:

New Sql 2008 | Reporting Service

Charla de Reporting Service y Sharepoint (Rosario)

by 23. junio 2009 02:40

El día 23 de Junio de 2009 estaré participando en la hermosa ciudad de Rosario de un evento organizado por el Club de usuarios Microsoft sobre SharePoint el cual dará Silvina Pizzarulli la cual es una experta en temas de SharePoint y me ha invitado a disertar junto a ella.

A mi me tocara mostrar la integración de WSS con Reporting Service, veremos como se hace como así también casos de implementación real donde se aplican Workflow, subscripciones , etc...

Aprovechare para ver a muchos amigos del MUG y poder compartir alguna comilona smile_wink

Tags:

Comprendiendo el funcionamiento de Transacciones en SQL Server

by 19. junio 2009 15:51

El otro día mientras daba un curso en una empresa para desarrolladores, vi que algunas cosas de las transacciones no se comprendían bien y francamente me llamo la atención.

Luego de ese curso pensé en explicar en mi blog como se manejan las transacciones dentro de SQL Server y que cuidados tener, y bueno aquí estamos smile_teeth

 

¿Porque usamos transacciones?

Bueno aquí la cosa parece simple verdad, básicamente usamos transacciones para poder asegurar integridad de una operación, si por ejemplo necesitamos guardar una factura y esta se compone de Cabecera y Detalle no se debería guardar si hubo algún error en el detalle.

También podríamos mencionar otros ejemplos, donde se necesitan hacer mas de una operación y de fallar alguna no aplicar nada.

Tenemos dos tipos de transacciones en SQL Server, las implícitas y las explicitas.

Las primeras son aquellas que no debemos indicarle al SQL que hacemos una transacción pero el lo genera, por ejemplo como el siguiente caso.

DELETE FROM CLIENTES
WHERE PAIS = 'ARGENTINA'

Aquí se ejecutara el delete para todos los clientes que cumplan la condición de Argentina, si hay un error al intentar borrar un cliente se hará un rollback y no se borrara ninguno, esto se debe a que el delete al igual que el insert y update internamente arman una transacción.

Las transacciones explicitas son aquellas que nosotros indicamos con la sentencia Begin Transaction / Commit o Rollback Transaction.

BEGIN TRANSACTION 
  INSERT INTO EMPLEADOS (ID, NOMBRE)
  VALUES (1,'CONDUIT')
  
  DELETE FROM AUDITORIA
  WHERE EMPLEADO = 1
COMMIT TRAN

¿Como funciona el Commit y Rollback?

El commit es el que confirmara la transacción y el rollback es el que la deshará, pero aquí hay algunos detalles muy importantes en su comportamiento cuando usamos transacciones anidadas.

Primero veamos un ejemplo simple

CREATE TABLE #T1 (ID INT, NOMBRE VARCHAR(50))
GO

CREATE TABLE #T2 (ID INT, FECHA DATETIME NOT NULL)
GO

BEGIN TRY

    BEGIN TRAN   
    
      INSERT INTO #T1 VALUES (1,'CONDUIT')
      INSERT INTO #T1 VALUES (1,GETDATE())
    
    COMMIT TRAN
END TRY

BEGIN CATCH
  ROLLBACK TRAN
  SELECT @@ERROR 
END CATCH
 

En el ejemplo básicamente hacemos dos insert y si hay algún error entramos en la sección del Catch y lo primero que hacemos es el rollback para luego mostrar el error.

Este es un simple ejemplo donde si no hay problemas se harán los dos insert y el commit los confirmara y de haber un error en algún insert se hará Rollback.

Anidar transacciones

Hasta aquí vimos dos ejemplos bastantes simples del manejo de transacciones. Ahora bien que sucede si necesitamos manejar transacciones anidadas, por ejemplo ejecutamos un Store que abre una transacción que llama a otro Store que abre otra transacción y así, o bien en el mismo código.

Aquí primero debemos comprender como impacta un Rollback y un Commit y es donde mayor confusión quizás hay.

El Rollback hará que se deshagan todas las transacciones o sea si armamos una transacción dentro de otra y la segunda hace un rollback hará que también la primera lo haga, en cambio el commit lo hará por cada bloque a menos que apliquemos un commit en el bloque externo lo cual hará que todo se comitee.

Para poder evaluar cuantas transacciones tenemos abiertas podemos utilizar la variable

@@Trancount

Para ser mas ejemplificado con este tema vamos a ver un poco de código, el primer ejemplo muestra como funciona el Rollback

 

USE TEMPDB
go

CREATE TABLE Cabecera (id int, fecha Datetime)
go

CREATE TABLE Detalle (CabeceraId int, linea int NOT NULL,
                      Cantidad decimal (8,2) NOT NULL)
GO

CREATE TABLE Auditoria (Id int identity,
                        Fecha datetime not null
                       ) 

-- Ejecute el Script por pasos para ir comprendiendo


-- ======================================= 
--      Funcionamiento del Rollback
-- =======================================

-- Vemos que no hay Transacciones
SELECT @@TRANCOUNT 

-- Abrimos una transacción
BEGIN TRAN
  -- hacemos los insert
  INSERT INTO Cabecera 
  VALUES (1,GETDATE())
  
  INSERT INTO Detalle 
  Values (1,1,100)
  
  -- vemos las transacciones abiertas (1)
  SELECT @@TRANCOUNT 

  -- Abrimos otra transacción
  BEGIN TRAN 
    -- Verificamos que Trancount se incremento en 1
    SELECT @@TRANCOUNT   
    
    -- Hacemos un Rollback
   ROLLBACK TRAN
  
    -- Verificamos que Trancount quedo en 0
    -- Lo cual ha hecho un rollback de todo
    SELECT @@TRANCOUNT   
go    

El siguiente ejemplo muestro como funciona el Commit con el manejo de transacciones

 
-- ======================================= 
--      Funcionamiento del Commit
-- =======================================

-- Vemos que no hay Transacciones
SELECT @@TRANCOUNT 

-- Abrimos una transacción
BEGIN TRAN
  -- hacemos los insert
  INSERT INTO Cabecera 
  VALUES (1,GETDATE())
  
  INSERT INTO Detalle 
  Values (1,1,100)
  
  -- vemos las transacciones abiertas (1)
  SELECT @@TRANCOUNT 

  -- Abrimos otra transacción
     BEGIN TRAN 
    -- Verificamos que Trancount se incremento en 1
     SELECT @@TRANCOUNT   
    
    -- Hacemos un Rollback
     INSERT INTO Auditoria (Fecha)
     VALUES (GETDATE())
  
     COMMIT TRAN
    -- Verificamos que Trancount decrecio en 1
     SELECT @@TRANCOUNT   

COMMIT TRAN  -- Hacemos el utimo Commit
  
-- Verificamos que Trancount queda en 0
SELECT @@TRANCOUNT   
go    
  

Hasta que pudimos observar con ejemplos la diferencia de comportamiento que tenemos entre el Rollback y el Commit

como hemos explicado en el inicio del articulo.

Ahora bien, en el siguiente ejemplo muestro como manejar transacciones anidadas sin que el rollback se vaya a 0 y que lo haga a un punto que yo determine.

-- ======================================= 
--      Manejo de transacciones Anidadas
-- =======================================

-- Vemos que no hay Transacciones
SELECT @@TRANCOUNT 

-- Abrimos una transacción
BEGIN TRAN A
  -- hacemos los insert
  INSERT INTO Cabecera 
  VALUES (1,GETDATE())
  
  INSERT INTO Detalle 
  Values (1,1,100)
  
  -- Hacemos un punto de salvacion
  
  SAVE TRAN B
  
  -- vemos las transacciones abiertas (1)
  SELECT @@TRANCOUNT 

  -- Abrimos otra transacción
     BEGIN TRAN C
    -- Verificamos que Trancount se incremento en 1
     SELECT @@TRANCOUNT   
    
    -- Hacemos un Rollback
     INSERT INTO Auditoria (Fecha)
     VALUES (GETDATE())
  
     ROLLBACK TRAN B
    -- Verificamos que Trancount es 2 y no 0
    -- Esto se da porque el rollback afecta 
    -- el punto de almacenamiento y no la transacción
    -- en si
     SELECT @@TRANCOUNT   

-- Hacemos los Commit
 COMMIT TRAN  
 COMMIT TRAN  
-- Verificamos que Trancount queda en 0
SELECT @@TRANCOUNT   
go    

-- Verificamos los datos y vemos que en Auditoria
-- no se guardaron registros porque hubo un rollback
-- pero solo de ese punto

SELECT * FROM Cabecera 
SELECT * FROM Detalle 
SELECT * FROM Auditoria 
  

Control de errores y transacciones

Hasta aquí hemos visto que el manejo del Rollback es muy distinto al del Commit Tran, ahora bien, como hacemos para controlar los errores ? la buena practica es que ante un error lo primero que se haga sea un Rollback pero que sucede si hubo un rollback anterior y el TranCount quedo en 0? Lo que deberíamos hacer es en control del error verificar primero la variable Trancount y si es mayor que 0 entonces si hacer el Rollback, aquí vemos un ejemplo.

 

-- ======================================= 
--      Manejo de Errores & transacciones 
-- =======================================
  
SELECT @@TRANCOUNT 

-- Abrimos una transacción
BEGIN TRY

BEGIN TRAN
  -- hacemos los insert
  INSERT INTO Cabecera 
  VALUES (1,GETDATE())
  
  INSERT INTO Detalle 
  Values (1,1,100)
  
  -- Abrimos otra transacción
  BEGIN TRAN 
    -- Verificamos que Trancount se incremento en 1
    SELECT @@TRANCOUNT   
    
    -- Generamos un error para ir al bloque CATCH
    INSERT INTO Auditoria (Fecha)
    VALUES (NULL)
  
    -- Verificamos que Trancount quedo en 0
    -- Lo cual ha hecho un rollback de todo
  
END TRY

-- Control de errores

BEGIN CATCH
  IF @@TRANCOUNT > 0
   BEGIN
    ROLLBACK TRAN
   END 

SELECT ERROR_MESSAGE() 

END CATCH
 

Conclusiones

En este post les he mostrado como se manejan y como funcionan las transacciones en SQL Server, siempre recuerden que las transacciones deberían durar lo mínimo posible para evitar loqueos que terminen en problemas de performance, escriban solo el código adecuado dentro del Begin y Commit.

Esto que vimos también se aplica si hay Stores procedures y en uno abren una transacción que llama a otro que a su vez abre otra transacción, recuerden del save tran para esos manejos si lo que desean es volver a un punto determinado.

Tags:

How To | TSQL

Novedades en SQL 2008 para desarrollo: Nuevos tipos de datos Fecha

by 11. junio 2009 03:45

Con este post estoy inaugurando una nueva sección en mi blog. La idea es ir mostrando con ejemplos prácticos las distintas novedades que tenemos en SQL Server 2008 para el desarrollador.

La mayoría de los post estarán orientados a la parte de programación.

Tratare de poner por lo menos un post distinto por semana.

En este primer post mostrare los nuevos tipos de datos relacionados con fechas y horas.

Estos nuevos tipos de datos están disponibles en todas las ediciones de SQL (Express, Workgroups, Web, Standard, Enterprise, Developer)

 

Introducción:

Hasta versiones anteriores a SQL 2008 disponíamos para guardar nuestras fechas y horas de dos tipos de datos Datetime y SmallDatetime.

En ambos tipos de datos se guardaba tanto la fecha como la hora.

El Datetime nos permite guardar fechas desde 1/1/1753 hasta el 31/12/9999, en cambio el SmallDatetime nos permite solo guardar los rangos que van desde 1/1/1900 hasta el 6/6/2079 y además tiene menos precisión que el anterior.

 

Uno de los grandes problemas de estos tipos de datos (podríamos decir mas que un problema una comodidad quizás) es que tanto la fecha como la hora se guardan ahí mismo, entonces si solo quiero guardar fechas debería siempre la hora ponerla en 00:00:00 y si solo quiero guardar horas la cosa se complica un poco mas y debería quizás tomar un valor estándar a nivel fecha , por ejemplo 1/1/1900.

Esto funciona lo mas bien pero es una incomodidad para la mayoría de los que desarrollamos.

Yo igual recomiendo siempre que se utilice el tipo de dato adecuado sin inventos, si hay que guardar fechas u horas usen datetime o smalldatetime en versiones anteriores a 2008.

También recuerden que la fechas no se guardan en ningún formato especial (dd/mm/yyyy o mm/dd/yyyyy) sino que se almacenan en bytes y luego el SQL las manipula según el idioma que tengamos definido en nuestro login, para lo cual es recomendable siempre manejarlas en formato ISO YYYYMMDD HH:mm:ss 

 

Nuevos tipos de datos en 2008

En la versión 2008 disponemos de nuevos tipos de datos para el manejo de fechas

Date:

Permite guardar solo la fecha con un rango que va desde el 0001-01-01 hasta el 9999-12-31

Aquí vemos un par de ejemplos

DECLARE @FECHA DATE

SET @FECHA = getdate()
SELECT @FECHA 

CREATE TABLE #DEMO1 (FECHA DATE)
go

INSERT INTO #DEMO1 VALUES ('20090610')
GO

Time:

Este tipo de datos solo almacena la hora en un rango que va desde las 00:00:00.0000000 hasta las 23:59:59.9999999

DECLARE @HORA TIME

SET @HORA = getdate()
SELECT @HORA 

CREATE TABLE #DEMO2 (HORA TIME)
go

INSERT INTO #DEMO2 VALUES ('12:30:00')
GO
 

Datetimeoffset

Este tipo de dato para mi es uno de los que yo mas esperaba y que realmente ayuda y mucho.

Hasta aquí hemos hablado de fechas y horas generales pero en ningún momento dijimos en que zona horaria esta una fecha, imaginemos que hacemos un sistema donde hay transacciones en distintas zonas geográficas, obviamente que una operación a las 10 AM –3 no es lo mismo que a las 10 AM –5.

Hasta versiones anteriores no teníamos forma de poder resolver este problema de forma simple, lo que yo hacia básicamente era tener una columna adicional smallint en la cual indicaba la zona horaria.

Bueno ahora por suerte en SQL 2008 disponemos de un tipo de datos que incluye la zona horaria, y ese tipo de datos es el Datetimeoffset.

Este tipo de dato guarda la fecha la hora y la zona horaria con un rango que va desde 0001-01-01 hasta  9999-12-31

Veamos un par de ejemplos

CREATE TABLE #DATOS (ID INT IDENTITY,
                     FECHA_HORA_UTC DATETIMEOFFSET
                    )  
GO

-- INSERTAMOS ALGUNOS REGISTROS


INSERT INTO #DATOS (FECHA_HORA_UTC)
VALUES ('2008-09-01T12:00:00-03:00'),
       ('2008-09-01T13:00:00-03:00'),
       ('2008-09-01T13:00:00-02:00'),
       ('2008-09-01T13:00:00+02:00'),
       ('2009-09-01T13:00:00+02:00')
       
GO

SELECT * FROM #DATOS

SELECT * FROM #DATOS 
ORDER BY FECHA_HORA_UTC  -- ORDENADO OFFSET

Podemos observar que el segundo query ordena las transacciones respetando la zona horaria donde por ejemplo la primer transacción es la numero 4 ya que su zona horaria es + 2 y tiene la misma fecha y hora que la operación 1,3 y 2

 

DateTime2

Este nuevo tipo de dato soporta fecha y hora pero se diferencia del Datetime clásico por el rango que va desde

0001-01-01 hasta 9999-12-31

 

Conclusiones Finales

 

Sql Server 2008 adiciona nuevos datos con respecto al manejo de fechas, ahora si tenemos el set completo smile_regular, como siempre recomiendo utilicen los tipos de datos adecuados, por ejemplo no usen un char o int para almacenar fechas u horas, en 2000 y 2005 usen Datetime y en 2008 tienen mas amplitud, la ventaja de usar los tipos de datos adecuados es también la posibilidad de usar funciones de forma simple, por ejemplo podríamos usar un Datepart cualquier tipo de datos fecha/hora.

 

Espero que este post los ayude.

Tags:

SQL 2008 | New Sql 2008

Como saber la versión y service pack de nuestro SQL

by 7. junio 2009 16:59

Hay muchas veces que se necesita saber que edición, versión y service pack tenemos en nuestra instalación.

Para poder sacar esta información hay distintas formas, una de ellas es usar la siguiente query

 

SELECT @@VERSION 
 

Obteniendo como resultado el siguiente ejemplo

 

Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
    Mar 29 2009 10:27:29
    Copyright (c) 1988-2008 Microsoft Corporation
    Developer Edition on Windows NT 6.0 <X86> (Build 6002: Service Pack 2)

 
Aquí podemos observar el tipo de edición (Developer) si es 32 o 64 bits, el nivel de Service pack del SO (SP2)
el build del SQL Server (10.0.2531.0) , su versión (SQL 2008) y hasta su service pack (SP1).
 
También podemos hacer esto mismo y además obtener mas información utilizando la función ServerProperty.
 
select SERVERPROPERTY('Edition') as Edicion,
       SERVERPROPERTY('ProductLevel') as ServicePack,
       
       case when
       
       substring(convert(varchar(15),
                 SERVERPROPERTY('ProductVersion')),
                 0,       
                 patindex('%.%',
                 convert(varchar(15),
                 SERVERPROPERTY('ProductVersion')))) = 8
       then '2000'           
       when 
       substring(convert(varchar(15),
                 SERVERPROPERTY('ProductVersion')),
                 0,       
                 patindex('%.%',
                 convert(varchar(15),
                 SERVERPROPERTY('ProductVersion')))) = 9
       then '2005'
       when 
       substring(convert(varchar(15),
                 SERVERPROPERTY('ProductVersion')),
                 0,       
                 patindex('%.%',
                 convert(varchar(15),
                 SERVERPROPERTY('ProductVersion')))) = 10
       then '2008' end as version,
       SERVERPROPERTY('Collation') as Collation,
       SERVERPROPERTY('InstanceName') as instancia
 
 

Tags:

How To

Webcast: Diseño en Reporting Service 2008

by 2. junio 2009 01:27

El día 26 de mayo he dado un webcast sobre diseño en Reporting Service 2008 SSRS.

Aquí les dejo el link

Tags:

Como pasar una base de SQL 2008 a 2005 o 2000

by 2. junio 2009 01:24

En algunas ocasiones podemos necesitar transformar una base de datos completa de una versión superior a una inferior.

Si  en la base de datos por ejemplo 2008 no se le han implementado features exclusivas de esa versión la conversión debería ser mas natural y simple que si tenemos features nuevas (lo cual deberíamos hacer algún proceso de reingeniería)

Supongamos que tenemos una base en un SQL 2008 a la cual no le aplicamos nuevas funcionalidades y se nos da por pasarla hacia atrás, uno lo primero que intentaría hacer es realizar un backup y luego un restore por ejemplo en el 2000 o 2005, si hacen esto recibirán un error al hacer el restore (Error 3169: The Backed-up database has on-disk structure version ….)

, este error se debe a que al estar en una version superior el formato de archivos es distinto por mas que la base este en un modo de compatibilidad inferior, supongamos que esta base de datos esta en un 2008 con un modo de compatibilidad 2000.

Entonces como hacemos esta tarea?

Pues bien, hay varias técnicas, una de ellas es armar primero los Script DDL de la base (tablas, índices, vistas, Stores, etc.) y luego por un método de exportación e importación de datos pasar la data.

Este método requiere de varios pasos y además de cierta complejidad.

En este post veremos como hacer esto mismo con un solo Script usando el Management Studio 2008.

 

  • Entre a su SSMS (SQL Server Management Studio) de 2008
  • Seleccione la base de datos que quiere pasar
  • Pulse botón alterno del mouse sobre ella, vaya a Task (o tareas) y luego a Generate Script.(Al hacer esto le aparecerá el siguiente Wizard).

image

  • Pulse el Checkbox "Script all Object in the selected database”, esto nos indica que se hará script de todos los objetos de esa base de datos y pulse el botón Next
  • En la siguiente pantalla observara las distintas opciones para generar el Script, y es aquí donde debemos concentrarnos aun mas y poner lo siguiente en cada opción
      • Script for SQL Server Version = SQL 2000 0 2005 dependiendo a que version queremos ir
      • Script Data = True
      • Script Foreign Key = True
      • Script Indexes = True
      • Script Primary Keys = True
      • Script Triggers  = True
      • Script Unique Key = True
      • Script Database Create = True

Con estas opciones de mínima ya estamos en condiciones de pasar al próximo paso del asistente en el cual indicaremos donde queremos guardar el script, por ejemplo yo seleccionare hacerlo en el disco C y con el nombre de Script2000.SQL.

 

image

Luego de hacer esto debemos culminar con el asistente el cual generara los Script con los datos incluidos para la version de SQL que le hemos seleccionado.

Si no se encuentra alguna compatibilidad, por ejemplo en la base tenemos cosas propias de 2008 el asistente no las convertirá y marcara un error en el paso indicando donde tenemos el problema, de sucedernos esto deberíamos hacer una reingeniería, por ejemplo cambiar el tipo de dato.

En mi caso se genero correctamente el Script ya que la base de datos que tenia en 2008 era un restore de una de 2000 pero luego no la podía pasar a 2000 con Backup y restore por el cambios de formato comentado en el inicio del post.

Bueno ahora lo que nos queda es abrir nuestro Query Analizer y ejecutar el Script  y tendremos creada en 2000 nuevamente la base con sus estructuras y datos también.

Tags:

How To

Maximiliano Damian Accotto