将Excel数据导入/粘贴到SQL表格中

我有一个名为动物的表。 我从这个表中获取数据来填充另一个系统。

我得到了需要进入动物表的动物列表的Excel数据。

Excel数据还会有其他标识符,如品种,颜色,年龄,最喜欢的玩具,兽医等。

这些标识符将随每个新的Excel文件而改变。 有些人可能会重复,其他人是全新的。

由于字段发生变化,我不知道每个新的excel文件将会出现哪些新的字段,我的动物表只有动物名称和动物名称。

我创build了一个Values表来保存所有其他标识符字段。 那张桌子是这样构成的:

AnimalId Value FieldId DataFileId 

然后我有一个Fields表,它保存Values表中的每个FieldId的键。

我这样做是因为替代方法是保留一个大的表格,这些表格可能甚至在每次需要添加数据时都不能使用。 一个有很多空列的大表。

我不确定我的方式是一个好方法。 它可能看起来过于复杂。

但是,假设这是一个好方法,将这个excel数据存入我的Values表的最好方法是什么? 动物列表很容易添加到我的动物表。 但是对于每个标识符(品种,颜色等),我必须复制或导入值,然后更新表来分配一个匹配的FieldId(或者在Fields表中如果还不存在,则在Field表中创build一个新的FieldId)。

如果有很多标识符,加载新数据是一个巨大的痛苦。 我真的很挣扎,可以使用更好的系统。

任何build议,帮助,或只是指着我在一个更好的方向将非常感激。

谢谢。

根据您的客户端(例如,我在Mac上使用SequelPro),您可能可以导入CSV。 这通常很不稳定,但您也可以将您的Excel文档导出为CSV …方便。

但是,这对你的数据库结构没有帮助。 当然,使用外键是一个不错的主意,但是不显眼地(轻松地)导入数据是需要一次一行地完成的。

但是,您可以尝试修改这样的内容来满足您的需求,首先将您的Excel文档导出为CSV格式,移除标题行(第一行),然后使用正则expression式将其更改为大块的SQL 。 例如:

您的CSV:

 myval1.1,myval1.2,myval1.3,myval1.4 myval2.1,myval2.2,myval2.3,myval2.4 ... 

在这一点上,你可以做这样的事情:

 myCsvText.replace(/^(.+),(.+),(.+)$/mg, 'INSERT INTO table_name(col1, col2, col3) VALUES($1, $2, $3)') 

在那里你知道列的数量,他们的名字,以及他们的价值是如何组织的(通过正则expression式和replace)。

可能是一个好地方开始。

你的桌子看起来不错。 由于您有不同数量的字段,因此纵向扩展似乎是合理的。 尽pipe您可能想通过将DataFileID和FieldID更改为FieldName和DataFileName来使自己更容易,除非您还将在很多其他表中使用它们。

不幸的是,从Excel中获取数据到SQL Server中并不像两个Microsoft产品与其他人互相交stream那样容易。 我知道你可以采取几条路线:

  1. 使用CSV文件而不是Excel文件。 Excel可以像Excel文件一样轻松地编辑CSV文件,但是在导入时,CSV是一个无限可靠的数据源。 对于不同的Excel版本,您不会遇到不同文件格式的问题,Excel必须安装在运行脚本的计算机上,或者自动识别数据types。 可以使用BCP命令行工具, BULK INSERT命令或SSIS读取CSV。 然后使用存储过程将水平批量的数据转换为纯垂直格式。

  2. 使用SSIS直接从Excel文件读取数据。 可以制作一个循环多个Excel文件的包。 缺点是Excel文件的列格式和表格名称必须事先知道,因此每次新的Excel格式到达时都必须创build一个不同的模板(带有单独的循环)。 有第三方SSIS组件声称更灵活,但我还没有testing过它们。

  3. 编写抓取Excel文件的Visual C#程序或PowerShell脚本,提取数据并输出到SQL表中。 Visual C#是一个非常简单的语言,在Office和SQL Server中具有强大的接口。 我不知道学习曲线开始有多大,但是一旦这样做,这将是一个非常简单的程序来编写。 我也听说过关于Powershell的好东西 。

  4. 创build一个使用VB代码打开其他Excel文件的Excelmacros,循环访问他们的数据,并将结果写入到预定义的工作表或CSV文件中。 一旦所有东西都是标准格式,使用上述方法之一就可以轻松导入数据。

由于我曾经有过1)和2)的头痛,所以我会build议3)或4)。 由于我在VBA方面的经验比Visual C#或PowerShell有更多的经验,如果我匆忙的话,我会去做。 但我认为3)长远来看是更好的投资。

(你也可以冒险,使用另一种脚本语言,比如Python,就像我之前做的那样,因为Python很酷,不幸的是,Python提供了相当缓慢且有限的SQL Server和Excel接口)

祝你好运!