Archive pour février 2008

Microsoft Certified Professional

28 février 2008

Sur une idée originale de mon ami Christophe, je publie ici tout mon pedigree :

Microsoft Certification Status

Credential Certification / Version Date Achieved
Microsoft Certified IT Professional Sep 28, 2007
Business Intelligence Developer Sep 28, 2007
Microsoft Certified Professional Developer May 16, 2007
Enterprise Application Developer May 16, 2007
Microsoft Certified Technology Specialist Feb 15, 2007
Microsoft® SQL Server™ 2005 Business Intelligence Development Sep 28, 2007
.Net Framework 2.0: Distributed Applications May 16, 2007
SQL Server 2005 Mar 20, 2007
.Net Framework 2.0: Web Applications Feb 15, 2007
.Net Framework 2.0: Windows Applications Feb 15, 2007

SQL Sever 2008 : Change Data Capture

26 février 2008

Je viens d’écrire un article sur une des fonctionnalités de SQL Server 2008 : le Change Data Capture (ou CDC). Je l’avais commencé avec la CTP2 (ça date). Il est maintenant terminé. Cet article dresse un portrait assez complet de la fonctionnalité et propose un petit tutoriel de mise en oeuvre.

Vous pouvez le consulter sur le site de Bewise: http://www.bewise.fr/SiteCollectionDocuments/Articles/article-57.doc 
Le code source est disponible ici.

Prochaine étape : l’utilisation dans un cas concret d’ETL avec SSIS.

Voici un petit aperçu en ligne :

Introduction

Le Change Data Capture (que nous appellerons CDC) est une nouvelle fonctionnalité de SQL Server 2008. Apparu dès la CTP2, Cet article se base sur la CTP5 et il n’est pas exclu qu’il y ait des modifications dans les versions suivantes.

Le CDC a une orientation initiale pour les processus d’ETL. L’objectif de CDC est d’optimiser l’intégration des données  en requêtant directement les modifications faites sur les bases de productions, plutôt que de comparer la source et la destination.

Bien entendu, on peut étendre l’utilisation du CDC à de la synchronisation entre 2 bases, à de l’audit ou à tout autre besoin nécessitant de connaître ce qu’il se passe sur une table.

Les exemples de cet article se basent sur AdventureWorks. Nous utiliserons la table des commandes SalesOrderHeader.

Principes de fonctionnement

Le CDC capture les modifications qui se font sur les tables. On choisit les tables sur lesquelles on souhaite faire la capture, toutes les modifications ne sont évidemment pas monitorées. On peut même restreindre la capture à quelques colonnes d’une table.

Le CDC est un processus asynchrone. Il fonctionne comme la réplication transactionnelle à savoir qu’un « agent » lit le journal de transaction (transaction log) et met de côté les modifications dans des tables spécifiques.

C’est la (ou les) applications « clients » qui viennent chercher les modifications. La récupération des modifications se fait sur demande en mode pull.

SQL Server 2008 CTP6

21 février 2008

La dernière CTP de SQL Server 2008 est enfin disponible en téléchargement. Au programme :

  • iFTS (Integrated Full-Text Search)
  • Compression
  • Filtres sur les index (oh oui)
  • Audit
  • Type SPARSE

 

Le lien est le suivant : x86
Pour les ISO ou autres versions je vous invite à consulter le site de Microsoft.

Enfin, je vais pouvoir jouer avec l’iFTS que j’ai présenté lors de ma session aux TechDays (d’ailleurs, j’ai un post en cours pour présenter ma session de façon epistolaire).

Insertion en masse et Triggers

17 février 2008

On m’a récemment posé cette question :

j’ai 300.000 enregistrements à insérer et pour chaque insertion, les triggers doivent être exécutés

Quand on parle d’une telle volumétrie d’insertion, on pense tout de suite à de l’insertion en mode BULK. Pour ce faire, nous avons à disposition :

  • un utilitaire en ligne de commande : bcp
  • l’instruction T-SQL : BULK INSERT

Le problème c’est que l’insertion BULK désactive les triggers par défaut. Mais les deux méthodes proposent une option pour ré-activer les triggers.

bcp -h "FIRE_TRIGGERS"

BULK INSERT .... WITH (FIRE_TRIGGERS)

Integration Services utilise intensivement l’insertion BULK via son composant OLE DB Destination avec l’option FastLoad. Les triggers étant désactivés par défaut, il faut les réactiver dans les options avancées du composant. Dans les propriétés, il y en a une appelée FastLoadOptions qui correspond au WITH de l’instruction BULK INSERT. Il suffit juste de rajouter FIRE_TRIGGERS dans la liste (séparé par des virgules).

Faire un cumul avec Reporting Services

16 février 2008

Erratum :

J’étais fatigué (retour de TechDays ??) quand j’ai écrit cet article car il y a une solution beaucoup plus simple (que je connaissais en plus). Je n’ai pas voulu écouter la petite voix dans ma tête qui me disait “abruti, abruti” quand j’ai cité la fonction Previous. Bref, la solution est :

=RunningValue(Fields!SubTotal.Value, Sum, Nothing)

Mais je vous invite à lire la solution proposée ci-dessous car elle est utile pour de aggrégats un peu custom (et puis pour dire que je n’ai pas gratté pour rien).

Article Original

Dans cet article nous allons voir comment faire une somme cumulée dans un rapport. Le principe est simple, j’ai des ventes dans le temps et pour chaque date, je veux le cumul depuis la première date.

Reporting Services n’offre pas cette fonctionnalité en natif mais nous allons mettre en place les élements pour le suporter. Sans vouloir gâcher la surprise, je peux déjà vous annoncer que l’on va passer par du code .NET ajouté au rapport.

Pour commencer, voyons ce que nous offre Reporting Services comme fonction en rapport avec notre besoin. Il y a la fonction Previous qui permet de récupérer des données dans la ligne précédente. Cependant, cela ne marche plus à partir de la 3eme ligne car la fonction ne remonte pas plus haut.

L’idée pour résoudre cette problématique est d’utiliser une variable qui va tenir le cumul depuis la première ligne. A chaque ligne, on ajoute la valeur en cours. Pour garder une variable, on doit passer par le code .NET.

Pour ce faire on passe par la fenêtre de propriétés du rapport, dans l’onglet Code.

Oubliez le confort de l’Intellisense, vous n’êtes pas dans Visual Studio, l’éditeur ressemble plutôt à Notepad. En espérant que Reporting Services 2008 apporte des améliorations dans ce sens (comme pour Integration Services). En plus, vous êtes limité uniquement à VB.NET comme langage.

Quant au code en lui-même il est assez simple. On garde un variable Shared (static) et on fournit une petite fonction pour mettre à jour et retourner le cumul.  Ici j’ai choisi le type Decimal car je souhaite retourner une somme d’argent. Rien de plus simple :

Shared cumul As Decimal = 0.0
Public Shared Function GetCumulativeSum(ByVal currentValue As Decimal) As Decimal
  cumul += currentValue
  Return cumul
End Function

Reste à utiliser ce code dans le rapport. Pour cela, on utilise une Expression dans un élément de notre DataRegion :

=Code!GetCumulativeSum(Fields!SalesAmount.Value)

 

Un des problèmes est que l’on ne peut pas utiliser cette technique de cumul à différents endroits. En effet, on ne repart jamais à zéro. Plutôt que de tenter de réinitialiser le cumul dans la première ligne d’une DataRegion, on préfèrera l’utilisation d’un dictionnaire dans le Custom Code. Voici le code utilisant un dictionnaire :

Shared cumuls As System.Collections.Generic.Dictionary(Of String, Decimal) = _
     New System.Collections.Generic.Dictionary(Of String, Decimal)
Public Shared Function GetCumulativeSum(ByVal currentValue As Decimal, ByVal sumKey As String) As Decimal
  If Not cumuls.ContainsKey(sumKey) Then
    cumuls.Add(sumKey, 0.0)
  End If
  cumuls.Item(sumKey) += currentValue
  Return cumuls.Item(sumKey)
End Function

Dans le rapport, on utilisera l’expression suivante :

=Code!GetCumulativeSum(Fields!SalesAmount.Value, "salesInChart")
...
=Code!GetCumulativeSum(Fields!TaxAmount.Value, "taxInMatrix")

Note : pour faire du C#, il faudra coder la fonction dans une assembly et la référencer dans le rapport.

Compatibilité Management Studio 2008 et SQL Server 2005

15 février 2008

J’en avais assez de travailler sur SQL Server 2008 sur une VPC alors j’ai sauté le pas en essayant de l’installer sur mon Vista classique. Pour une raison que j’ignore, la première installation s’est mal passée dans le sens ou il était impossible d’xécuter une requête sur aucune des instances (2005 & 2008).

Je tente un tout bête uninstall / install et miracle, tout marche bien. Les 2 versions cohabitent super bien et l’effet que j’attendais :

J’ai l’intellisense sous SQL Server 2005 grâce à Management Studio 2008 qui arrive à travailler avec une base de données de version inférieure.

Je n’ai évidemment pas tout testé : Full-Text, Broker, connexion IP, etc. mais je vous remonterais les problèmes si j’en rencontre.

A noter que je n’ai rien installé des outils de Business Intelligence (je suis sur un projet et je ne veux rien casser), je vais faire des essais et je reviendrai dessus dans un prochain post.

 

Récupérer uniquement la date d’un champ DateTime

14 février 2008

En attendant l’utilisation massive du champ Date (juste la date) de SQL Server 2008, il faut ruser pour récupérer une date sans les heures/minutes depuis un champ DateTime.

2 méthodes s’offrent à nous :

  1. Cast(DATEDIFF(day, 0, monchampDateTime) As DateTime)
  2. Convert(varchar(20), monchampDateTime, 102)

Le premier est plus performant que le second. Le second renvoie un type string.

TechDays, c’est fini

14 février 2008

Juste un post rapide pour marquer la fin des TechDays. Je ferai un post plus important dans quelques jours pour vous relater cette première expérience des TechDays.

Notre session (à Seb et moi) c’est bien passée, des questions intéressantes que je relaierai ici dans quelques temps.

Un coucou aux gens croisés sur place : Eric, Lionel, Philippe, Nicolas (du stand EMC), Sébastien de Criteo, etc.

PS : je re-râle après les grévistes de l’aviation civile… nous avons mis 7h30 pour revenir à Toulouse :-(  

 

 

Coup de Gueule & TechDays

11 février 2008

Mon vol pour Paris est annulé…merci la CGT !! (Et encore je suis poli). Donc il fallait que je râle publiquement. C’est fait ! Je dois me rabattre sur la SNCF (ce qui n’est pas forcément mieux).

Je vais tout faire pour être présent à ma session de mercredi. Ne t’inquiète pas Seb, je ne te laisserai pas tout seul !

Donc, à tous, J-2 pour la session sur les fonctionnalités FileStream, Remote BLOB  et iFTS de SQL Server 2008

Gestion des textes et des images avec SQL Server 2005 et 2008 : XML, FTS, FileStream, Gestion des BLOB…

 

RDV au palais des congrès !!

 

 

Notification Services est mort ?

2 février 2008

Beaucoup de monde me pose des questions en formation ou en consulting sur Notification Services. Apparemment, la news circule mal donc je la relaye via mon blog :

Notification Services ne se trouvera pas dans SQL Server 2008.

On ne sait pas grand chose sinon ceci :

5.0 Deprecated Features

This section covers SQL Server 2005 features that are no longer included with SQL Server 2008.

5.1 SQL Server Notification Services Removed from SQL Server 2008

SQL Server Notification Services will not be included as a component of SQL Server 2008, but will continue to be supported as part of the SQL Server 2005 product support life-cycle. Moving forward, support for key notification scenarios will be incorporated into SQL Server Reporting Services. Existing Reporting Services functionality, such as data driven subscriptions, addresses some of the notification requirements. Features to support additional notification scenarios may be expected in future releases.

Attention, ne confondez pas avec les Query Notifications qui sont à la base du SqlDependency et SqlNotificationRequest. D’ailleurs, j’ai un petit post en préparation sur le sujet.

Merci à Christian pour avoir transmis l’info sur la communauté française. Au passage, petite pub pour son blog qui est une mine d’infos sur SQL Server : http://blogs.codes-sources.com/christian/archive/2007/08/02/sql-server-adieu-notification-services.aspx


Suivre

Get every new post delivered to your Inbox.

Joignez-vous à 203 followers