Puis-je interroger un fichier délimité par des tabulations depuis SSMS?

14

Est-il possible d'interroger un fichier délimité par des tabulations à partir de Sql Server Management Studio pour afficher ses données sans les enregistrer n'importe où?

Je sais que vous pouvez à BULK INSERTpartir d'un fichier délimité par des tabulations en utilisant quelque chose comme:

BULK INSERT SomeTable
FROM 'MyFile.txt'
WITH (
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n');

cependant, cela nécessite que vous connaissiez les colonnes à l'avance et que vous créiez une table pour contenir les données.

Je sais également que vous pouvez interroger d'autres types de fichiers tels que CSV ou Excel sans définir à l'avance les colonnes à l'aide de OPENROWSETet les pilotes Excel, tels que:

-- Query CSV
SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Text;Database=\\Server\Folder\;HDR=Yes;', 
    'SELECT * FROM MyFile.csv')

-- Query Excel
SELECT *
FROM OPENROWSET('Microsoft.Ace.OLEDB.12.0', 
    'Excel 8.0;Database=MyFile.xls', 
    'SELECT * FROM [Sheet1$]')

De plus, si je modifie la clé de Registre Formatsous HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Textde CSVDelimitedà TabDelimitedsur sur SQL Server, la requête CSV ci-dessus lira correctement un fichier texte délimité par des tabulations, mais elle ne lira plus un fichier texte délimité par des virgules, donc je ne pense pas que je veux de le laisser comme ça.

Tenter d'utiliser Format=TabDelimiteddans le OPENROWSETne fonctionne pas non plus

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Text;Database=\\Server\Folder\;HDR=Yes;Format=TabDelimited', 
    'SELECT * FROM MyFile.txt')

J'ai tenté de copier les Textclés de registre des clés Engineset ISAM Formatsvers quelque chose de personnalisé par défaut TabDelimited, mais il lit toujours les fichiers avec CSVFormatau lieu du TabDelimitedformat, donc je dois manquer quelque chose ici.

Existe-t-il un moyen d'interroger un fichier délimité par des tabulations pour afficher son contenu sans avoir à créer une table et BULK INSERTlui?

J'utilise SQL Server 2005

Rachel
la source
Est-il acceptable d'utiliser une table temporaire créée dynamiquement qui est vidée après utilisation?
jcolebrand
Deuxième question: avez-vous essayé d'utiliser les pilotes Excel pour simplement ouvrir le TDF? Parfois, Excel est magique.
jcolebrand
@jcolebrand Oui, je peux utiliser des tables temporaires, mais la liste des colonnes est assez longue et peut changer, donc je préfère de loin pouvoir spécifier uniquement les colonnes qui m'intéressent au lieu d'avoir à écrire la définition de toutes et n'oubliez pas de les mettre à jour chaque fois que les colonnes inutiles changent.
Rachel
@jcolebrand Je n'avais pas pensé à essayer les pilotes Excel, même si cela ne semble pas prometteur pour le moment. L'extension de fichier est en fait .bakce qui n'est pas une extension de fichier délimitée normale, et l'erreur qu'elle m'a donné lors de mon premier essai est Could not find installable ISAM, donc je ne pense pas que cela fonctionnera.
Rachel
2
Je voudrais personnellement analyser la liste des colonnes à la volée à partir du fichier à chaque fois (il suffit de faire un nombre d'onglets dans la première ligne du fichier) au lieu d'essayer de suivre le nombre de colonnes nécessaires à l'importation, donc la table temporaire créée dynamiquement . À mon avis, ne codez jamais en dur ce que vous pouvez inverser à partir des données.
jcolebrand

Réponses:

13

Vous devez créer un fichier schema.ini contenant le délimiteur dans le même répertoire que le fichier texte que vous ouvrez. C'est le seul moyen de remplacer les valeurs de registre par fichier. Voir la documentation sur le format de fichier sur MSDN . Exemple:

SELECT * 
FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0', 
    'Text; HDR=YES; Database=C:\Text', 
    'SELECT * FROM testupload2.txt')

Dans C: \ Text \ schema.ini:

[testupload2.txt]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=0

Si cette activité doit être répétée fréquemment, je suggère un script pour créer schema.ini. Plusieurs fichiers peuvent être référencés dans le même schema.ini ou un schema.ini distinct peut être inclus avec chaque fichier texte dans son propre répertoire.

dartonw
la source
Merci beaucoup! J'avais vu des indices d'utilisation d'un fichier schema.ini, mais j'avais du mal à trouver comment en implémenter un moi-même
Rachel
Je sais que c'est un vieux post mais je viens de dire "Nice Job" @dartonw.
Jeff Moden