Posso eseguire una query su un file delimitato da tabulazioni da SSMS?


14

È possibile eseguire una query su un file delimitato da tabulazioni da Sql Server Management Studio per visualizzare i suoi dati senza salvarli da nessuna parte?

So che puoi farlo BULK INSERTda un file delimitato da tabulazioni usando qualcosa del tipo:

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

tuttavia ciò richiede la conoscenza anticipata delle colonne e la creazione di una tabella per contenere i dati.

So anche che puoi interrogare alcuni altri tipi di file come CSV o Excel senza definire in anticipo le colonne utilizzando OPENROWSETe i driver di Excel, come:

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

Inoltre, se cambio la chiave di registro Formatin HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Textda CSVDelimiteda TabDelimitedsu SQL Server, la query CSV sopra leggerà correttamente un file di testo delimitato da tabulazioni, tuttavia non leggerà più un file di testo delimitato da virgole, quindi non credo di volerlo per lasciarlo così.

Anche il tentativo di utilizzare Format=TabDelimitedin OPENROWSETnon funziona

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

Ho fatto alcuni tentativi di copiare le Textchiavi del Registro di sistema da entrambe le chiavi Enginese ISAM Formatssu qualcosa di personalizzato che viene impostato per impostazione predefinita TabDelimited, tuttavia continua a leggere i file CSVFormatanziché il TabDelimitedformato, quindi qui mi manca qualcosa.

C'è un modo per interrogare un file delimitato da tabulazioni per visualizzarne il contenuto senza dover creare una tabella e BULK INSERTesso?

Sto usando SQL Server 2005


È accettabile utilizzare una tabella temporanea creata dinamicamente che viene scaricata dopo l'uso?
jcolebrand

Seconda domanda: hai provato a usare i driver Excel per aprire il TDF? A volte Excel è magico.
jcolebrand

@jcolebrand Sì, posso usare le tabelle temporanee, tuttavia l'elenco delle colonne è piuttosto lungo e può cambiare, quindi preferirei piuttosto poter specificare solo le colonne a cui sono interessato invece di dover scrivere la definizione per tutte e ricordando di aggiornarli ogni volta che cambiano le colonne non necessarie.
Rachel,

@jcolebrand Non avevo pensato di provare i driver Excel, anche se non sembra promettente in questo momento. L'estensione del file è in realtà .bakche non è una normale estensione delimitata, e l'errore che mi ha dato al mio primo tentativo è Could not find installable ISAM, quindi non penso che funzionerà.
Rachel,

2
Analizzerei personalmente l'elenco delle colonne al volo dal file ogni volta (basta fare un conteggio delle schede nella prima riga del file) invece di cercare di tenere il passo con il numero di colonne necessarie per l'importazione, quindi la tabella temporanea creata dinamicamente . A mio avviso, non codificare mai ciò che è possibile decodificare dai dati.
jcolebrand

Risposte:


13

È necessario creare un file schema.ini contenente il delimitatore nella stessa directory del file di testo che si sta aprendo. Questo è l'unico modo per sovrascrivere i valori di registro in base al file. Vedere la documentazione sul formato del file su MSDN . Esempio:

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

Se questa attività deve essere ripetuta frequentemente, suggerirei uno script per creare schema.ini. È possibile fare riferimento a più file nello stesso schema.ini oppure è possibile includere uno schema.ini separato in ciascun file di testo nella propria directory.


Grazie mille! Avevo visto dei suggerimenti sull'uso di un file schema.ini, tuttavia avevo difficoltà a capire come implementarne uno da solo
Rachel,

So che questo è un vecchio post, ma dovevo solo dire "Bel lavoro" @dartonw.
Jeff Moden,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.