Kann ich eine tabulatorgetrennte Datei von SSMS abfragen?

14

Ist es möglich, eine tabulatorgetrennte Datei in Sql Server Management Studio abzufragen, um ihre Daten anzuzeigen, ohne sie irgendwo zu speichern?

Ich weiß, dass Sie BULK INSERTaus einer durch Tabulatoren getrennten Datei Folgendes verwenden können:

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

Dazu müssen Sie jedoch die Spalten im Voraus kennen und eine Tabelle für die Daten erstellen.

Ich weiß auch, dass Sie einige andere Dateitypen wie CSV oder Excel abfragen können, ohne zuvor die Spalten mit OPENROWSETund die Excel-Treiber zu definieren, z.

-- 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$]')

Wenn ich auf dem SQL Server den Registrierungsschlüssel Formatunter HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Textvon CSVDelimitedin ändere TabDelimited, liest die obige CSV-Abfrage eine durch Tabulatoren getrennte Textdatei korrekt, eine durch Kommas getrennte Textdatei wird jedoch nicht mehr gelesen, sodass ich nicht glaube, dass ich das möchte es so zu lassen.

Der Versuch, Format=TabDelimitedin der zu verwenden, OPENROWSETfunktioniert auch nicht

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

Ich habe einige Versuche unternommen, die TextRegistrierungsschlüssel von den Schlüsseln Enginesund ISAM Formatsin einen benutzerdefinierten TabDelimitedOrdner zu kopieren, der standardmäßig verwendet wird. Es werden jedoch weiterhin Dateien mit CSVFormatanstelle des TabDelimitedFormats gelesen, sodass hier etwas fehlen muss.

Gibt es eine Möglichkeit, eine tabulatorgetrennte Datei abzufragen, um ihren Inhalt anzuzeigen, ohne eine Tabelle erstellen zu müssen BULK INSERT?

Ich verwende SQL Server 2005

Rachel
quelle
Ist es akzeptabel, eine dynamisch erstellte temporäre Tabelle zu verwenden, die nach der Verwendung gelöscht wird?
jcolebrand
Zweite Frage: Haben Sie versucht, mit den Excel-Treibern nur das TDF zu öffnen? Manchmal ist Excel magisch.
jcolebrand
@jcolebrand Ja, ich kann temporäre Tabellen verwenden, aber die Spaltenliste ist ziemlich lang und kann sich ändern. Daher wäre es mir lieber, nur die Spalten anzugeben, an denen ich interessiert bin, als die Definition für alle zu schreiben und denken Sie daran, diese zu aktualisieren, wenn sich die nicht benötigten Spalten ändern.
Rachel
@jcolebrand Ich hätte nicht gedacht, die Excel-Treiber auszuprobieren, obwohl sie momentan nicht vielversprechend aussehen. Die Dateierweiterung ist eigentlich .bakkeine normal begrenzte Dateierweiterung, und der Fehler, den ich beim ersten Versuch erhalten habe, ist Could not find installable ISAM, also denke ich nicht, dass dies funktionieren wird.
Rachel
2
Ich persönlich würde die Spaltenliste jedes Mal direkt aus der Datei analysieren (mache einfach eine Anzahl von Tabulatoren in der ersten Zeile der Datei), anstatt zu versuchen, mit der Anzahl der für den Import benötigten Spalten Schritt zu halten, also mit der dynamisch erstellten temporären Tabelle . Niemals hart codieren, was Sie aus den Daten meiner Meinung nach zurückentwickeln können.
jcolebrand

Antworten:

13

Sie müssen eine schema.ini-Datei erstellen, die das Trennzeichen in demselben Verzeichnis enthält wie die zu öffnende Textdatei. Dies ist die einzige Möglichkeit, die Registrierungswerte auf Dateibasis zu überschreiben. Weitere Informationen finden Sie in der Dokumentation zum Dateiformat auf MSDN . Beispiel:

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

In C: \ Text \ schema.ini:

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

Wenn diese Aktivität häufig wiederholt werden muss, würde ich ein Skript zum Erstellen der schema.ini vorschlagen. Auf mehrere Dateien kann in derselben schema.ini verwiesen werden, oder es kann eine separate schema.ini in jeder Textdatei in einem eigenen Verzeichnis enthalten sein.

dartonw
quelle
Vielen Dank! Ich hatte Hinweise auf die Verwendung einer schema.ini-Datei gesehen, hatte jedoch Probleme damit, eine selbst zu implementieren
Rachel,
Ich weiß, dass dies ein alter Beitrag ist, aber ich musste nur "Nice Job" @dartonw sagen.
Jeff Moden