Ça faisait longtemps que je n’avais pas écrit d’article 😮
C’est une question posée par Steve Simon sur une mailing liste « secrète » qui m’a poussé à faire quelques tests et valider le fonctionnement de la commande OpenQuery() sur un cube tabulaire en DAX !
Linked Server
La création de serveurs liés dans SQL Server n’est plus à présenter, cela permet au moteur de base de données SQL Server d’exécuter des commandes sur des sources de données OLEDB situées en dehors de l’instance.
En général, les serveurs liés sont configurés pour permettre d’exécuter une instruction Transact-SQL qui inclut des tables situées dans une autre instance ou dans une autre base de données comme Oracle, DB2, Access, Excel,… A ce titre j’avais écrit un article sur la création d’un serveur lié sur une base de données Informix : https://pulsweb.azurewebsites.net/serveur-lie-informix/.
Un autre exemple que j’aime bien sur l’utilisation d’un serveur lié : Klout avait besoin de créer un cube multidimensionnel sur des données hébergées dans un clusteur Hadoop. La solution fut d’utiliser SQL Server comme relais ou proxy pour exécuter des commandes sur une source de données OLEDB (MSDASQL) via le driver Hive ODBC :
SSAS Multidimensionnel (MDX)
La commande T-SQL sp_addlinkedserver permet de créer un serveur lié, ici sur un cube SSAS Multidimensionnel :
EXEC master.dbo.sp_addlinkedserver @server='MSSAS', @srvproduct='ssas', @provider='MSOLAP', @datasrc='CASTERESROMAIN', @catalog= ‘AdventureWorksDW2012Multidimensional’;
La commande OPENQUERY() permet d’exécuter une requête sur le serveur lié spécifié.
Voici une requête MDX sur le cube multidimensionnel référencé par le serveur lié « MSSAS » :
SELECT * FROM OPENQUERY([MSSAS], 'SELECT [Measures].[Reseller Sales Amount] ON 0 FROM [MyCube]') as tmp;
SSAS Tabulaire (MDX & DAX)
Voici la requête T-SQL permettant d’ajouter un serveur lié SSAS Tabulaire :
EXEC master.dbo.sp_addlinkedserver @server='TSSAS', @srvproduct='ssas', @provider='MSOLAP', @datasrc='CASTERESROMAIN\TAB', @catalog='AdventureWorks Tabular Model SQL 2012';
Voici une requête MDX sur le cube tabulaire référencé par le serveur lié « TSSAS » :
SELECT * FROM OPENQUERY([TSSAS], 'SELECT [Measures].[Internet Total Units] ON 0 FROM [Internet Operation]') as tmp;
Et le meilleur pour la fin, une requête DAX sur le même cube tabulaire :
SELECT * FROM OPENQUERY([TSSAS], 'EVALUATE(''Internet Sales'')') AS tmp;
Cela laisse entrevoir pas mal de cas d’utilisations 🙂 Ainsi il est intéressant de pouvoir extraire des données en DAX, en MDX, en HiveQL, en DMX, … puis de pouvoir les remanier facilement a l’aide de T-SQL.
Bonus : Linked Server Hadoop Hive
Requête T-SQL permettant d’ajouter un serveur lié Hive :
EXEC master.dbo.sp_addlinkedserver @server = 'HiveDW', @srvproduct='HIVE', @provider='MSDASQL', @datasrc='hdiapvx16', @provstr='Provider=MSDASQL.1;Persist Security Info=True;User ID=###; Password=###;'
Pour afficher la liste des tables Hive :
SELECT * FROM OPENQUERY ([HiveDW],'SHOW TABLES;');
Hello,
Sinon si le besoin est plus ponctuel et que tu ne veux pas créer de serveurs liés, tu peux utiliser OpenRowSet http://msdn.microsoft.com/fr-fr/library/ms190312.aspx
Hello,
Corrigez moi si je dis des bêtises mais pour avoir essayer les deux méthodes, il me semble que la différence se situe au niveau des paramètres.
OPENQUERY accepte les paramètres à l’intérieur de la requête alors qu’avec OPENROWSET il n’est pas possible d’y intégrer des paramètres?
Bonjour, en effet :
– OPENDATASOURCE : Permet une connexion de type ad hoc (http://msdn.microsoft.com/fr-fr/library/ms179856.aspx)
– OPENROWSET : attend toutes les informations de connexion nécessaires permettant d’accéder aux données à distance à partir d’une source de données OLEDB (http://msdn.microsoft.com/fr-fr/library/ms190312.aspx)
– OPENQUERY : nécessite un serveur lié pour exécuter la requête (http://msdn.microsoft.com/fr-fr/library/ms188427.aspx)