Je voudrais exporter toutes les données de mon schéma dwh au format CSV (Tables + Vues) Problématique simple au premier abord, mais pas tant que ça …
En effet, SSMS me permet de le faire, mais il faut faire table par table… c’est pas très confortable, j’ai donc opté pour un mix entre BCP, sys.objects, et un curseur.
DECLARE @query VARCHAR(1000) DECLARE db_cursor CURSOR FOR SELECT 'bcp ' + QUOTENAME(DB_NAME()) + '.' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(NAME) + ' ' + 'out' + ' ' + 'c:\MonChemin\' + NAME + '.csv -w -t";" -E -S ' + @@servername + ' -T' AS Query FROM sys.objects WHERE TYPE IN ( 'v' ,'u' ) AND is_ms_shipped = 0 AND SCHEMA_NAME(schema_id) LIKE '%dwh%' OPEN db_cursor FETCH NEXT FROM db_cursor INTO @query WHILE @@FETCH_STATUS = 0 BEGIN EXEC [master].[sys].[xp_cmdshell] @query PRINT @query FETCH NEXT FROM db_cursor INTO @query END CLOSE db_cursor DEALLOCATE db_cursor
Quelques explications:
TYPE IN ( 'v' ,'u' )
On ne prend que les tables et les vues
AND SCHEMA_NAME(schema_id) LIKE '%dwh%'
Que le schéma dwh, on pourrait aussi le remplacer par DB_NAME… pour garder que certaines tables …
+ ' ' + 'out' + ' ' + 'c:\MonChemin\' + NAME + '.csv -w -t";" -E -S '
Le chemin et le type de fichier de destination, le -t »; » permet d’indiquer le séparateur.
EXEC [master].[sys].[xp_cmdshell] @query
Cette commande va directement exectuer les commandes dans la console.
Après execution de la commande, nous avons un fichier .csv par table avec séparateur « ; » dans le dossier c:\MonChemin\