我可以从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$]')

另外,如果我更改注册表项FormatHKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\TextCSVDelimitedTabDelimitedSQL Server上,上面的CSV查询将正确读取制表符分隔的文本文件,但是它将不再读取逗号分隔的文本文件,所以我不认为我想留下那样

尝试使用Format=TabDelimitedOPENROWSET也不起作用

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

Answers:


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。


非常感谢你!我曾经看到过使用schema.ini文件的提示,但是我很难弄清楚如何自己实现一个文件
Rachel

我知道这是一篇旧文章,但我只想说“ Nice Job” @dartonw。
杰夫·摩登2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.