jeudi 27 décembre 2012

[SQL] : Limitation comptage distinct sur une fenêtre de données

SQL Server propose un ensemble de fonctions d’agrégation comme la somme, la moyenne, le comptage, etc..., ces fonctions combinées aux clauses OVER, offrent des possibilités de calcul et d'analyse très intéressantes.

Pour répondre à une problématique métier dont la solution technique devait, initialement, s'appuyer sur un : 
COUNT (DISTINCT MaColonne1) OVER (PARTITION BY MaColonne2), j'ai été confronté à l'erreur suivante :

Incorrect syntax near 'distinct'

Après quelques recherches, il s’avère que c'est une limitation liée au moteur de base de données SQL Server.

En testant la requête sur une instance SQL 2012, cette limitation est toujours présente, la seule chose qui a été améliorée est le message d'erreur, qui est beaucoup plus explicite :

Use of DISTINCT is not allowed with the OVER clause

Une solution de contournement, consiste à combiner la fonction DENSE_RANK : qui permet de caclculer le rang de la ligne par valeur distincte, et la fonction MAX pour récupérer la valeur la plus élevée de ce rang.

/* Requête initialement utilisée*/
SELECT DISTINCT [CalendarYear]
      ,[FrenchMonthName]
      ,COUNT(DISTINCT([WeekNumberOfYear])) OVER (PARTITION BY [CalendarYear]) AS NombreSemaineParAnnee
FROM [dbo].[DimDate]

/* Solution de contournement basée sur le Dense_Rank et le Max*/

WITH cte AS
(
SELECT [CalendarYear]
      ,[FrenchMonthName]
      ,DENSE_RANK() OVER (PARTITION BY [CalendarYear] ORDER BY [WeekNumberOfYear]) AS NombreSemaineParAnnee
FROM [dbo].[DimDate]
)
SELECT DISTINCT [CalendarYear]
      ,[FrenchMonthName]
      ,MAX(NombreSemaineParAnnee) OVER (PARTITION BY [CalendarYear]) AS NombreSemaineParAnnee
FROM cte


Source : Connect

lundi 24 décembre 2012

[SSAS] : Modifications nécessitant un ProcessFull

Pour qu'un cube soit accessible aux utilisateurs, il faut qu'il soit dans un état "Processed".
Parfois, on peut être amené à y apporter des modifications/corrections mais sans devoir re-processer tout le cube.

Avant de réaliser ces modifications, certains points sont à prendre en compte, comme les opérations ayant un impact sur l'état du cube et pouvant le rendre inaccessible et donc en conséquence nécessitant un PorcessFull.

Les opérations mettant le cube dans un état "Unprocessed" sont les suivantes:
  • L'ajout d'une hiérarchie d'attribut dans une dimension.
  • Modification des relations entre les dimensions et les groupes de mesures.
  • Modification des relations entre les hiérarchies d'attributs.
  • Ajout d'une mesure ou d'un groupe de mesure.
  • Changement de la fonction d’agrégation d'une mesure.
  • Modification de la propriété OrderBy ou OrderByAttribute.
  • Modification de la propriété UnknownMember.
  • Ajout/suppression de la traduction.
  • ProcessUpdate d'une dimension avec des relations de type rigide et dont les données ont changées (Exemple: Produit A appartenant à la Catégorie A et ayant été affecté, entre temps, à la Catégorie B).
  • Et bien évidemment un ProcessFull au niveau d'une dimension, pour cela, SSMS et BIDS dispose d'un bouton d'analyse d'impact et qui est accessible au moment du processing :

Donc avant de réaliser des modifications, analysez bien les impacts de celles-ci sur l'état du cube et ainsi, le cas échéant, les planifier en dehors des horaires d'utilisation.

vendredi 14 décembre 2012

[TAB] : Compatibilité PowerPivot pour Excel 2013 et SSAS Tabulaire

Importer un classeur PowerPivot pour Excel 2013 vers une instance SSAS Tabulaire, est une opération qui s’avère très simple à première vue.

Ainsi, en voulant réaliser cette opération, j'ai été confronté à l'erreur suivantes:
"A connection corresponding to the embedded PowerPivot data was not found in the Excel workbook"
Ce message d'erreur qui laisse penser à un problème de connexion aux sources de données, n'est qu'un problème de compatibilité entre le moteur AS utilisé par PowerPivot pour Excel 2013 est celui de la version SSAS 2012 RTM.

Pour résoudre ce problème, il suffit d'installer le Service Pack 1.

Source : Connect

mardi 27 novembre 2012

[SSIS] : Projet SSIS en mode Offline

Petit astuce du jour, comment mettre en mode Offline un projet SSIS sans l'ouvrir dans BIDS.

Un des points noires dans SSIS, c'est la validation de toutes les connexions à chaque ouverture du projet.

En ouvrant mon projet SSIS et ayant plusieurs packages d'ouvert en même temps, mon projet met plus de 10 minutes pour valider toutes les connexions.

Afin d'éviter d'attendre tout ce temps, j'essaye de le mettre en mode Offline sauf qu'il faut attendre qu'il valide toutes les connexions.

Donc je cherche un peu dans les fichiers du projet et il y a bien la propriété qui permet de le faire.
Elle se trouve dans le fichier portant l'extension ".dtproj.user" :

Donc il suffit juste de l'ouvrir avec un éditeur de texte, et modifier la valeur de la balise "OfflineMode" :


Et le tour est joué.

lundi 9 juillet 2012

[SQL] : Récupérati​on du rôle SysAdmin SQL Server

Un cas de figure qui se présente souvent quand on récupère une machine qui possède une instance SQL Server version 2008 ou ultérieur, c'est de ne pas pouvoir s'y connecter et cela malgré le fait qu'on est Admin Local.
Pour pouvoir se rajouter les droits SysAdmin sur l'instance, il faut suivre les étapes suivantes, le seul près-requis c'est d'avoir les droits d'admin local sur la machine, les étapes se résument en quatre:

1- Arrêt du service SQL Server, le nom du service est MSSQLSERVER pour une instance par défaut et MSSQLSERVER$NomInstance pour une instance nommée :
net stop MSSQLSERVER

2- Démarrage du service mssqlserver en mode mono :
net start MSSQLSERVER /M

3- Lancement du SQLCMD pour se rajouter les droits SysAdmin :
EXEC sp_addsrvrolemember 'domaine\utilisateur', 'sysadmin';
GO

4- Redémarrage mssqlserver en mode normal :
net stop MSSQLSERVER
net start MSSQLSERVER

Bonne récupération...

jeudi 9 février 2012

[SSRS] : Désactiver le Report Manager

Parmi les nouveautés qu'avait apporté la version 2008 de Reporting Services en terme de configuration, la désactivation de l'accès au Report Manager et ainsi n'exposer aux utilisateurs que le ReportViewer (Url par défaut http://localhost/reportserver).

La désactivation du report manager se fait via le fichier de configuration rsreportserver.config, à travers la propriété IsReportManagerEnabled, cette propriété étant à True par défaut, il faut la passer à Flase:


<IsReportManagerEnabled>True</IsReportManagerEnabled>

Une fois désactivé, l’accès au Report Manager renvoi le message d'erreur suivant :

Il faut noter que cette opération ne nécessite pas de redémarrage du service RS.

lundi 6 février 2012

Suppression automatique d'un Job SQL Agent

Dans SQL Agent, il est possible de configurer un Job pour une suppression automatique après exécution. Pour cela il faut aller dans les propriétés du Job, dans l'onglet "Notifications" cocher "Automatically delete job" avec la possibilité de le faire après succès, échec ou tout simplement exécution du Job.


Cela peut être utile pour la réalisation de certaines tâches ponctuelles.

mercredi 25 janvier 2012

[SQL] Récuperation du script de modification de tables

Un petit post rapide pour voir comment récupérer le script de modification d'une table (renommage de colonne, modification de type de données ou ajout de colonne...).
Pour cela, il faut ouvrir la table en mode création, faire la modification et puis cliquer sur la petite icône entourée en rouge :



Et le script généré par la modification s'affiche, cela peut être utile pour industrialiser les modifications de tables ou tout simplement connaître le comportement d'SQL Server suivant le type de modification (ALTER, DROP, SP_RENAME,...).


Par exemple, le fait de mettre un champs en IDENTITY passe obligatoirement par un DROP TABLE. 

[SQL] Dépendance entre tables et foreign Key

Voici une petite requête SQL pour récupérer la liste des tables référencées par des clés étrangères dans une table donnée:
 
SELECT tf.name AS 'Table_Principale',tp.name AS 'Table_Referencee', fk.name AS 'ForeignKey'
FROM sys.foreign_key_columns fkc
INNER JOIN sys.foreign_keys fk
      ON fkc.constraint_object_id = fk.object_id
INNER JOIN sys.tables tf
      ON tf.object_id = fkc.parent_object_id
INNER JOIN sys.tables tp
      ON tp.object_id = fkc.referenced_object_id
WHERE tf.name = 'NomDeLaTable'


Pour l'utiliser il suffit de remplacer dans la clause WHERE 'NomDeLaTable' par le nom de la table que vous voulez.

Cela peut être utile pour désactiver les contraintes d'intégrités ou tout simplement connaître les relations entre les tables.

vendredi 6 janvier 2012

[SQL 2012] : SQL Server Data Tools (ex Juneau)


SQL Server Data Tools (SSDT) est un nouvel outil de développement apporté par SQL Server 2012 dans l'optique d'unifier les outils de développement SQL et d'améliorer la productivité des développeurs.

Avec SSDT, vous développez une seule fois et vous pouvez déployer sur plusieurs plates-formes : SQL Server 2005/2008/2012 ou encore SQL Azure.

SSDT apporte plusieurs fonctionnalités digne d'un outil de développement et qui simplifie la vie aux développeurs, à savoir: