我使用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
数据库已经有很多和建筑物,我需要导入一些检查。要点是:
我可以选择执行此类数据加载吗?
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位版本缺少此功能),将每个工作表加载到(新)数据库表中。该向导负责(大部分)脏细节,包括创建适当的DB结构。
使用您喜欢的客户端登录数据库。为了简化SQL编码,我在新表中创建了一些额外的字段。
开始交易。
BEGIN TRANSACTION;
更新新创建的表中的辅助列:
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在使用现有表加入新表时抱怨了排序规则冲突。通过在新表中设置适当的排序规则来修复它,但方法不同:在SQL Server 2005中,我可以简单地从SQL Server管理器更改排序规则(单击,单击,保存和完成)但在SQL Server 2008中我必须设置排序规则在导入向导中手动(“编辑SQL”按钮)。
答案 0 :(得分:0)
1)将excel文件转换为CSV格式。
2)将CSV文件导入保留表:SQL SERVER – Import CSV File Into SQL Server Using Bulk Insert – Load Comma Delimited File Into SQL Server
3)编写一个存储过程/脚本,在其中声明局部变量并遍历保持表中的每一行,构建实际表中的正确行。由于这是一次性加载,因此循环中没有任何羞耻感,您将完全控制所有逻辑。
答案 1 :(得分:0)
您的数据必须在数据文件中包含自然主键。看起来lot_code可能是一个,但我没有看到构建表的一个。
另外,您说检查通过批次代码与建筑物相关,但表中的关系是建筑物和检查之间的关系。
如果数据建模正确,您可以导入临时表,然后使用自然键插入/更新目标表。
答案 2 :(得分:0)
我最初将此答案添加到问题本身。我将其移至正确答案,因为那是正确的位置。无论如何,请注意整个业务都是从2010年开始的,因此该信息可能会不再相关。
如果其他人必须执行类似的任务,则这些步骤是数据加载最终所需的步骤:
准备Excel文件:删除不需要的列,为工作表和列标题指定适当的名称,等等。
使用 SQL Server导入/导出向导(32位版本; 64位版本缺少此功能),将的每个工作表加载到(新)数据库表中。该向导将处理(大部分)脏的细节,包括创建适当的数据库结构。
使用您喜欢的客户端登录数据库。为了简化SQL编码,我在新表中创建了一些额外的字段。
开始交易。
BEGIN TRANSACTION;
更新新创建的表中的辅助列:
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在将新表与现有表连接时抱怨排序规则冲突。通过在新表中设置适当的排序规则来解决此问题,但是方法有所不同:在SQL Server 2005中,我可以简单地从SQL Server管理器中更改排序规则(单击,单击,保存并完成),但是在SQL Server 2008中,我必须设置排序规则手动在导入向导中(“编辑SQL”按钮)。