Posso consultar um arquivo delimitado por tabulações no SSMS?

14

É possível consultar um arquivo delimitado por tabulações no Sql Server Management Studio para visualizar seus dados sem salvá-los em qualquer lugar?

Eu sei que você pode BULK INSERTde um arquivo delimitado por tabulações usando algo como:

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

no entanto, isso exige que você conheça as colunas com antecedência e crie uma tabela para armazenar os dados.

Também sei que você pode consultar outros tipos de arquivos, como CSV ou Excel, sem definir as colunas com antecedência, usando OPENROWSETos drivers do Excel, como:

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

Além disso, se eu mudar a chave de registro Formatsob HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Texta partir CSVDelimitedde TabDelimitedsobre o SQL Server, a consulta CSV acima irá ler corretamente um arquivo de texto delimitado por tabulação, no entanto, ele não irá ler um arquivo de texto separado por vírgulas para que eu não acho que eu quero para deixar assim.

Tentar usar Format=TabDelimitedno OPENROWSETtambém não funciona

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

Fiz algumas tentativas para copiar as Textchaves de registro de ambos os Enginese ISAM Formatschaves para algo personalizado que o padrão é TabDelimited, no entanto, é ainda leitura de arquivos com CSVFormatem vez de TabDelimitedformato de modo que deve estar faltando alguma coisa aqui.

Existe uma maneira de consultar um arquivo delimitado por tabulação para exibir seu conteúdo sem ter que criar uma tabela BULK INSERT?

Estou usando o SQL Server 2005

Rachel
fonte
É aceitável usar uma tabela temporária criada dinamicamente que é liberada após o uso?
jcolebrand
Segunda pergunta: você tentou usar os drivers do Excel para abrir o TDF? Às vezes, o Excel é mágico.
jcolebrand
@jcolebrand Sim, eu posso usar tabelas temporárias, no entanto, a lista de colunas é bastante longa e pode mudar, por isso prefiro especificar apenas as colunas nas quais estou interessado, em vez de ter que escrever a definição para todas elas e lembre-se de atualizá-los sempre que as colunas desnecessárias forem alteradas.
26412 Rachel
@jcolebrand Eu não tinha pensado em experimentar os drivers do excel, embora não pareça promissor no momento. Na verdade, a extensão do arquivo .baknão é uma extensão delimitada normal e o erro que ele me deu na primeira tentativa é Could not find installable ISAM, portanto, não acho que isso funcione.
26412 Rachel
2
Pessoalmente, analisava a lista de colunas em tempo real a partir do arquivo a cada vez (basta fazer uma contagem de guias na primeira linha do arquivo) em vez de tentar acompanhar o número de colunas necessárias para a importação, assim a tabela temporária criada dinamicamente . Nunca codifique o que você pode fazer engenharia reversa a partir dos dados, na minha opinião.
jcolebrand

Respostas:

13

Você deve criar um arquivo schema.ini que contenha o delimitador no mesmo diretório que o arquivo de texto que está abrindo. Essa é a única maneira de substituir os valores do registro por arquivo. Consulte a documentação do formato do arquivo no MSDN . Exemplo:

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

Em C: \ Text \ schema.ini:

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

Se essa atividade precisar ser repetida com frequência, sugiro um script para criar o schema.ini. Vários arquivos podem ser referenciados no mesmo schema.ini ou um schema.ini separado pode ser incluído em cada arquivo de texto em seu próprio diretório.

dartonw
fonte
Muito obrigado! Eu já tinha visto indícios de uso de um arquivo schema.ini, no entanto eu estava tendo dificuldade para descobrir como implementar um no meu próprio
Rachel
Eu sei que este é um post antigo, mas eu tinha que dizer "Bom trabalho" @dartonw.
Jeff Moden