Могу ли я запросить файл с разделителями табуляции из SSMS?

14

Можно ли запросить файл с разделителями табуляции в Sql Server Management Studio, чтобы просмотреть его данные, не сохраняя их где-либо?

Я знаю, что вы можете BULK INSERTиз файла с разделителями табуляции, используя что-то вроде:

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

однако для этого необходимо заранее знать столбцы и создать таблицу для хранения данных.

Я также знаю, что вы можете запрашивать некоторые другие типы файлов, такие как CSV или Excel, не определяя столбцы заранее, используя OPENROWSETдрайверы Excel, такие как:

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

Кроме того , если я изменить ключ реестра Formatпод HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Textот CSVDelimitedк TabDelimitedна SQL Server, запрос CSV выше будет правильно читать табуляцией текстовый файл, однако он больше не будет читать разделенный запятыми текстовый файл , так что я не думаю , что я хочу оставить это так.

Попытка использовать Format=TabDelimitedв OPENROWSETтоже не работает

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

Я предпринял несколько попыток скопировать Textключи реестра как из ключей, так Enginesи из ISAM Formatsключей, во что-то нестандартное, по умолчанию TabDelimited, но он все еще читает файлы CSVFormatвместо TabDelimitedформата, поэтому я должен что-то здесь упустить.

Есть ли способ запросить файл с разделителями табуляции, чтобы просмотреть его содержимое, не создавая таблицу и BULK INSERTее?

Я использую SQL Server 2005

Рейчел
источник
Допустимо ли использовать динамически создаваемую временную таблицу, которая сбрасывается после использования?
Jcolebrand
Второй вопрос: вы пытались использовать драйверы Excel, чтобы просто открыть TDF? Иногда Excel - это волшебство.
Jcolebrand
@jcolebrand Да, я могу использовать временные таблицы, однако список столбцов довольно длинный и может измениться, поэтому я бы предпочел указывать только те столбцы, которые мне интересны, вместо того, чтобы выписывать определение для всех них и не забывая обновлять их в любое время, когда ненужные столбцы меняются.
Рэйчел
@jcolebrand Я не думал попробовать драйверы Excel, хотя сейчас это не выглядит многообещающе. Расширение файла на самом деле .bakне является обычным расширением с разделителями, и ошибка, которую он дал мне при первой попытке Could not find installable ISAM, не думаю, что это сработает.
Рэйчел
2
Я бы лично разбирал список столбцов на лету из файла каждый раз (просто делаю подсчет вкладок в первой строке файла) вместо того, чтобы пытаться не отставать от количества столбцов, необходимых для импорта, таким образом, динамически создаваемой временной таблицы , На мой взгляд, никогда не зашифровывай то, что ты можешь реконструировать из данных.
Jcolebrand

Ответы:

13

Вы должны создать файл schema.ini, содержащий разделитель в том же каталоге, что и открываемый текстовый файл. Это единственный способ переопределить значения реестра для каждого файла. См. Документацию формата файла на MSDN . Пример:

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

В C: \ Text \ schema.ini:

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

Если это действие нужно повторять часто, я бы предложил сценарий для создания schema.ini. Несколько файлов могут ссылаться в одном и том же schema.ini, или отдельный schema.ini может быть включен в каждый текстовый файл в своем собственном каталоге.

dartonw
источник
Большое спасибо! Я видел намеки на использование файла schema.ini, однако мне было трудно понять, как реализовать его самостоятельно
Рэйчел
Я знаю, что это старый пост, но я просто должен был сказать «Хорошая работа» @dartonw.
Джефф Моден