将本地 TSV 文件放入 SQL table
Local TSV file into SQL table
我的本地机器上有一个 tsv 文件,需要将值加载到 SQL table 中。我可以编写执行此操作的 SQL 脚本吗?或者我是否必须制作 SSIS 包或使用类似的工具?
有几个个解决方案:
SQL Server Management Studio > select 目标数据库节点 > 打开上下文菜单 > 任务 > 导入数据 ...
SQL 服务器集成服务 > Flat File Source
T-SQL 语句 BULK INSERT
与 \t
COLUMNTERMINATOR
T-SQL 函数 OPENROWSET(BULK 'file path')
与 format file and \t
terminator
bcp 带有 -t
参数的工具(默认值 \t
)
TextFieldParser class (with Delimiters
propery) and {SqlBulkCopy class or SqlCommandclass}
其他解决方案。
注意:对于 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 太大而再次失败,您可以:
- 使用我在上面粘贴的第一个查询来创建 table
- 运行 在 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
:
- 使用上面的查询创建 table
- 将上面的
BULK INSERT
查询保存在名为 Target.sql
或其他名称的文件中,然后:
sqlcmd -S localhost -d ip2location -U sqlninja -P sqlninja -i Target.sql -o Errors.txt
我的本地机器上有一个 tsv 文件,需要将值加载到 SQL table 中。我可以编写执行此操作的 SQL 脚本吗?或者我是否必须制作 SSIS 包或使用类似的工具?
有几个个解决方案:
SQL Server Management Studio > select 目标数据库节点 > 打开上下文菜单 > 任务 > 导入数据 ...
SQL 服务器集成服务 > Flat File Source
T-SQL 语句
BULK INSERT
与\t
COLUMNTERMINATORT-SQL 函数
OPENROWSET(BULK 'file path')
与 format file and\t
terminatorbcp 带有
-t
参数的工具(默认值\t
)TextFieldParser class (with
Delimiters
propery) and {SqlBulkCopy class or SqlCommandclass}其他解决方案。
注意:对于 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 太大而再次失败,您可以:
- 使用我在上面粘贴的第一个查询来创建 table
- 运行 在 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
:
- 使用上面的查询创建 table
- 将上面的
BULK INSERT
查询保存在名为Target.sql
或其他名称的文件中,然后:
sqlcmd -S localhost -d ip2location -U sqlninja -P sqlninja -i Target.sql -o Errors.txt