将本地 TSV 文件放入 SQL table

Local TSV file into SQL table

我的本地机器上有一个 tsv 文件,需要将值加载到 SQL table 中。我可以编写执行此操作的 SQL 脚本吗?或者我是否必须制作 SSIS 包或使用类似的工具?

几个个解决方案:

  1. SQL Server Management Studio > select 目标数据库节点 > 打开上下文菜单 > 任务 > 导入数据 ...

  2. SQL 服务器集成服务 > Flat File Source

  3. T-SQL 语句 BULK INSERT\t COLUMNTERMINATOR

  4. T-SQL 函数 OPENROWSET(BULK 'file path')format file and \t terminator

  5. bcp 带有 -t 参数的工具(默认值 \t

  6. TextFieldParser class (with Delimiters propery) and {SqlBulkCopy class or SqlCommandclass}

  7. 其他解决方案。

注意:对于 3) 和 4) 源文件需要由 SQL 服务器实例访问(通常,这意味着源文件必须与 SQL 服务器位于同一台机器上)

@Bogdan Sahlean 给出了非常详尽的回复。

然而我们都知道,在 SQL 服务器中导入任何文件并不容易,而且总是在第一次尝试时失败。

如果你像我一样 生气 而导入一个像 this one 这样重量几千兆位的 .tsv 我有一个快速的解决方案。

在 SSMS 2017 中,您可以执行以下操作:右键单击数据库 > 任务 > 导入平面文件...,然后为所有数据类型设置 nvarchar(MAX) 并为所有行勾选 Allow Nulls

这样你将导入数据错误的方式但至少它们被导入了。

您现在可以清理它们了。

编辑: 如果你面对 Exception of type 'System.OutOfMemoryException' was thrown. (mscorlib) 你可以创建 table:

USE ip2location;  
GO  
DROP TABLE OpenStreetMap;  
CREATE TABLE OpenStreetMap   
(
name nvarchar(MAX) NULL,  
alternative_names nvarchar(MAX) NULL,  
osm_type nvarchar(MAX) NULL,  
osm_id nvarchar(MAX) NULL,  
class nvarchar(MAX) NULL,  
type nvarchar(MAX) NULL, 
lon nvarchar(MAX) NULL,  
lan nvarchar(MAX) NULL,  
place_rank nvarchar(MAX) NULL,  
importance nvarchar(MAX) NULL,  
street nvarchar(MAX) NULL, 
city nvarchar(MAX) NULL,  
county nvarchar(MAX) NULL,  
state nvarchar(MAX) NULL,  
country nvarchar(MAX) NULL,  
display_name nvarchar(MAX) NULL, 
west nvarchar(MAX) NULL,  
south nvarchar(MAX) NULL,
east nvarchar(MAX) NULL,  
north nvarchar(MAX) NULL,    
wikidata nvarchar(MAX) NULL,  
wikipedia nvarchar(MAX) NULL,  
housenumbers nvarchar(MAX) NULL, 
);  
GO 

然后使用 BULK INSERT 导入:

BULK INSERT OpenStreetMap
FROM 'C:\Users\franc\Desktop\planet-latest_geonames.tsv\planet-latest_geonames-sorted.tsv'
WITH (
  DATAFILETYPE = 'char',
  FIELDTERMINATOR = '\t',
  KEEPNULLS
);

编辑,编辑: 如果因为 table 太大而再次失败,您可以:

  1. 使用我在上面粘贴的第一个查询来创建 table
  2. 运行 在 CMD 终端上:

bcp ip2location.dbo.OpenStreetMap in C:\Users\franc\Desktop\planet-latest_geonames.tsv\planet-latest_geonames-sorted.tsv -S localhost -U sqlninja -P sqlninja -c -r /r

编辑,编辑,编辑:

还是失败了?让我们试试 SQLCMD:

  1. 使用上面的查询创建 table
  2. 将上面的 BULK INSERT 查询保存在名为 Target.sql 或其他名称的文件中,然后:

sqlcmd -S localhost -d ip2location -U sqlninja -P sqlninja -i Target.sql -o Errors.txt