准备和导入数据到现有的数据库
我用SQL Server后端维护一个PHP应用程序。 数据库结构大致是这样的:
lot === lot_id (pk, identify) lot_code building ======== buildin_id (pk, identity) lot_id (fk) inspection ========== inspection_id (pk, identify) building_id (fk) date inspector result
该数据库已经有很多和build筑物,我需要import一些检查。 要点是:
- 这是一次性的初始负载。
- 数据来自Excel文件。
- Excel数据不知道数据库自动生成的ID:检查必须通过lot_code链接到build筑物
我有什么select来做这样的数据加载?
date inspector result lot_code ========== =========== ======== ======== 31/12/2009 John Smith Pass 987654X 28/02/2010 Bill Jones Fail 123456B
更新:我是如何做到的
如果其他人需要做类似的任务,这些是数据加载最终需要的步骤:
-
准备Excel文件:删除不需要的列,为表格和列标题等指定正确的名称
-
使用
SQL Server Import / Export Wizard
(32位版本; 64位版本缺less此function),将每个工作表加载到(新)数据库表中。 该向导负责(大部分)脏的细节,包括创build适当的DB结构。 -
用您最喜爱的客户端login数据库。 为了简化SQL编码,我在新表中创build了一些额外的字段。
-
开始交易。
BEGIN TRANSACTION;
-
更新新创build的表中的辅助列:
UPDATE excel_inspection$ SET building_id = bu.building_id FROM building bu INNER JOIN ....
-
在目标表中插入数据:
INSERT INTO inspection (...) SELECT ... FROM excel_inspection$ WHERE ....
-
如果一切正常,请查看结果并提交交易:
COMMIT;
在我的情况下,SQL Server在使用现有的表连接新表时抱怨sorting冲突。 它是通过在新表中设置适当的sorting规则来解决的,但方法不同:在SQL Server 2005中,我可以简单地从SQL Serverpipe理器(单击,单击,保存和完成)更改sorting规则,但是在SQL Server 2008中必须设置sorting规则手动导入向导(“编辑SQL”button)。
1)将excel文件转换为CSV。
2)将CSV文件导入到保存表中: SQL SERVER – 使用批量插入将CSV文件导入SQL Server – 将逗号分隔文件加载到SQL Server中
3)编写一个存储过程/脚本,在其中声明局部variables并循环遍历保持表中的每一行,在实际表中构build适当的行。 由于这是一次性加载,所以在循环中不会感到羞耻,并且可以完全控制所有的逻辑。
您的数据必须在数据文件中具有自然的主键。 它看起来像lot_code可能是一个,但我没有看到一个build筑物表。
另外,你说检查是通过批号与build筑物相关的,但是表中的关系是build筑和检查之间的关系。
如果数据build模正确,则可以导入临时表,然后使用自然键插入/更新目标表。