我可以从 SSMS 查询制表符分隔的文件吗?

Rac*_*hel 14 sql-server-2005 csv

是否可以从 Sql Server Management Studio 查询制表符分隔的文件以查看其数据而不将其保存在任何地方?

我知道您可以使用以下内容BULK INSERT从制表符分隔的文件中:

BULK INSERT SomeTable
FROM 'MyFile.txt'
WITH (
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n');
Run Code Online (Sandbox Code Playgroud)

但是,这需要您提前知道列并创建一个表来保存数据。

我也知道您可以查询其他一些文件类型,例如 CSV 或 Excel,而无需使用OPENROWSETExcel 驱动程序提前定义列,例如:

-- 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$]')
Run Code Online (Sandbox Code Playgroud)

另外,如果我更改注册表项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')
Run Code Online (Sandbox Code Playgroud)

我已经尝试将Text注册表项从EnginesISAM Formats键复制到默认为 的自定义内容TabDelimited,但是它仍在读取文件CSVFormat而不是TabDelimited格式,所以我一定在这里遗漏了一些东西。

有没有办法查询制表符分隔的文件以查看其内容而无需创建表和BULK INSERT它?

我正在使用 SQL Server 2005

dar*_*onw 14

您必须在与您打开的文本文件相同的目录中创建一个包含分隔符的 schema.ini 文件。这是基于每个文件覆盖注册表值的唯一方法。请参阅MSDN上的文件格式文档。例子:

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

在 C:\Text\schema.ini 中:

[testupload2.txt]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=0
Run Code Online (Sandbox Code Playgroud)

如果此活动需要频繁重复,我建议使用脚本来创建 schema.ini。可以在同一个 schema.ini 中引用多个文件,也可以将单独的 schema.ini 与每个文本文件包含在其自己的目录中。