SQL Server : un Data WareHouse avec les Ad Hoc Distributed Queries
C’est une des fonctionnalités les plus intéressantes de SQL Server. Sans doute une des plus méconnues. Les ad hoc distributed queries permettent, à partir de liens ODBC, d’interroger et de rapatrier des données venant de n’importe quel moteur de base de données dans un Dataware House constitué à partir d’une instance SQL Server. Elles sont une excellente alternative à l’utilisation d’un ETL comme Talend Studio ou les packages SSIS, dès lors que vous savez jouer du MERGE, du INSERT INTO et du SET IDENTITY_INSERT.
L’exemple ci-dessous va vous montrer comment intégrer des données venant de MySQL dans SQL Server.
Installer le driver ODBC
Vous devez au préalable disposer du driver ODBC 64 bits sur votre machine Windows Server vous permettant de communiquer avec votre base de données distante :
- MySQL ODBC/Connector
- psqlODBC – PostgreSQL ODBC driver
- MariaDB Connector/ODBC
- SQLite ODBC Driver
- Oracle Instant Client, qui suppose le paiement de licence(s)
Créer un connecteur ODBC
Pour vous éviter de la complication syntaxique inutile lors de l’écriture de votre ad hoc distributed query, le plus simple est encore de créer un Data Source Name à l’aide de la commande odbcad32.exe. Allez dans l’onglet Source de données système et choisissez Ajouter. Spécifiez tout d’abord votre driver ODBC correspondant à la base de données distante.
Entrez les informations nécessaires pour vous connecter à la base distante et appuyez sur Test pour vérifier la connexion.
Activer la prise en charge des Ad Hoc Distributed Queries
Par défaut, la prise en charge des requêtes de type Ad Hoc Distributed Queries n’est pas activée sur les moteurs SQL Server. Pour les activer, exécutez à partir de l’éditeur de requêtes SSMS :
sp_configure 'show advanced options', 1; RECONFIGURE; GO sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE; GO
La requête de type Ad Hoc Query
Vous disposez de deux syntaxes. Après avoir constitué le Data Source Name, vous pouvez interroger la table actor de la base sakila de MySQL comme suit :
SELECT src.* FROM OPENROWSET ( 'MSDASQL', 'DSN=mysql_localhost_sakila', 'SELECT * FROM actor' ) as src
Sans DSN, l’écriture de la requête est un peu plus compliquée :
SELECT src.* FROM OPENROWSET ( 'MSDASQL', 'Driver={MySQL ODBC 8.0 ANSI Driver};Server=localhost;Database=sakila;User=root;Password=root;', 'SELECT * FROM actor' ) as src