将本地TSV文件导入SQL表

时间:2015-08-02 06:13:18

标签: sql sql-server tsv

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

2 个答案:

答案 0 :(得分:5)

很少解决方案:

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

  2. SQL Server Integration Services> Flat File Source

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

  4. 使用format file and \t terminator

  5. 的T-SQL函数OPENROWSET(BULK 'file path') 带有-t参数的
  6. bcp工具(默认值\t

  7. TextFieldParser课程(Delimiters属)和{SqlBulkCopy班级或SqlCommand班级

  8. 其他解决方案。

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

答案 1 :(得分:1)

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

但是,我们都知道在SQL Server中导入任何文件都不容易,并且在首次尝试时总是会失败。

如果您在导入.tsv时像我一样 生气 ,而这些nvarchar(MAX)的重量却很少,例如this one,那么我为您提供了一个快速的解决方案。 / p>

在SSMS 2017中,您可以执行以下操作:右键单击数据库>任务>导入平面文件...,然后为所有数据类型设置Allow Nulls,并为所有行打Exception of type 'System.OutOfMemoryException' was thrown. (mscorlib)

enter image description here

通过这种方式,您将导入数据错误的方式,但至少已将其导入。

您现在可以清理它们。

编辑:如果您遇到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 OpenStreetMap
FROM 'C:\Users\franc\Desktop\planet-latest_geonames.tsv\planet-latest_geonames-sorted.tsv'
WITH (
  DATAFILETYPE = 'char',
  FIELDTERMINATOR = '\t',
  KEEPNULLS
);

然后使用BULK INSERT导入:

SQLCMD

编辑,编辑:如果由于表太大而再次失败,您可以:

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

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

enter image description here

编辑,编辑,编辑:

仍然失败?让我们尝试BULK INSERT

  1. 使用上面的查询创建表
  2. 将上面的Target.sql查询保存在名为int buttonId = -1; protected void onCreate(Bundle b){ //set the layout related stuff first Bundle b = getIntent().getExtras(); if(b!= null && (b.getInt(NEW_BUTTON_KEY, -1)!=-1)){ buttonPanel = (LinearLayout)findViewById(R.id.LinearButtonPanel); for(int i = 0; i< b.getInt(NEW_BUTTON_KEY, -1); i++) Button newButton = new Button(this); newButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); newButton.setId(i); newButton.setText("Button " + i); buttonPanel.addView(newButton); } } 的文件中,然后执行以下操作:

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