Czy mogę wysłać zapytanie do pliku rozdzielanego tabulatorami z SSMS?


14

Czy możliwe jest zapytanie pliku rozdzielanego tabulatorami z Sql Server Management Studio, aby wyświetlić jego dane bez zapisywania go w dowolnym miejscu?

Wiem, że możesz BULK INSERTużyć pliku rozdzielanego tabulatorami, używając czegoś takiego:

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

wymaga to jednak wcześniejszej znajomości kolumn i utworzenia tabeli do przechowywania danych.

Wiem również, że możesz przesyłać zapytania do niektórych innych typów plików, takich jak CSV lub Excel, bez wcześniejszego zdefiniowania kolumn OPENROWSETi sterowników Excel, takich jak:

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

Ponadto, w przypadku zmiany klucza rejestru Formatpod HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Textod CSVDelimitedcelu TabDelimitedna serwerze SQL, zapytanie CSV powyżej będzie prawidłowo odczytać plik tekstowy tabulatorami, jednak nie będzie już odczytać plik tekstowy rozdzielany przecinkami więc nie sądzę, chcę tak to zostawić.

Próba użycia Format=TabDelimitedw OPENROWSETnie działa również

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

Podjąłem kilka prób skopiowania Textkluczy rejestru zarówno z kluczy, jak Enginesi ISAM Formatsdo niestandardowych ustawień domyślnych TabDelimited, jednak nadal odczytuje pliki CSVFormatw TabDelimitedformacie zamiast formatu, więc tutaj czegoś mi brakuje.

Czy istnieje sposób zapytania o plik rozdzielany tabulatorami w celu wyświetlenia jego zawartości bez konieczności tworzenia tabeli i pliku BULK INSERT?

Używam SQL Server 2005


Czy dopuszczalne jest stosowanie dynamicznie tworzonej tabeli temp, która jest opróżniana po użyciu?
jcolebrand

Drugie pytanie: czy próbowałeś użyć sterowników Excela, aby po prostu otworzyć TDF? Czasami Excel jest magiczny.
jcolebrand

@jcolebrand Tak, mogę korzystać z tabel tymczasowych, jednak lista kolumn jest dość długa i może ulec zmianie, więc wolałbym określić tylko te kolumny, które mnie interesują, zamiast pisać dla nich definicję i pamiętając o ich aktualizacji za każdym razem, gdy zmieniają się niepotrzebne kolumny.
Rachel

@jcolebrand Nie pomyślałem o wypróbowaniu sterowników Excela, choć nie wygląda to teraz obiecująco. Rozszerzenie pliku nie jest tak naprawdę .bakzwykłym rozszerzeniem z ogranicznikami, a błąd, który podał mi przy pierwszej próbie, jest Could not find installable ISAMtaki, więc nie sądzę, aby to zadziałało.
Rachel

2
Osobiście analizowałbym listę kolumn w locie z pliku za każdym razem (po prostu zrób tabulator w pierwszej linii pliku) zamiast próbować nadążyć za liczbą kolumn potrzebnych do importu, a więc dynamicznie utworzonej tabeli tymczasowej . Moim zdaniem, nigdy nie koduj na stałe tego, co możesz odtworzyć na podstawie danych.
jcolebrand

Odpowiedzi:


13

Musisz utworzyć plik schema.ini zawierający separator w tym samym katalogu, co otwierany plik tekstowy. Jest to jedyny sposób na zastąpienie wartości rejestru dla poszczególnych plików. Zobacz dokumentację formatu pliku na MSDN . Przykład:

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

W C: \ Text \ schema.ini:

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

Jeśli to działanie musi być często powtarzane, sugerowałbym skrypt do utworzenia schema.ini. Do wielu plików można odwoływać się w tym samym pliku schema.ini lub do każdego pliku tekstowego we własnym katalogu można dołączyć osobny plik schema.ini.


Dziękuję Ci bardzo! Widziałem wskazówki dotyczące używania pliku schema.ini, ale miałem problem z ustaleniem, jak sam go wdrożyć
Rachel

Wiem, że to stary post, ale po prostu musiałem powiedzieć „Nice Job” @dartonw.
Jeff Moden
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.