准备并将数据导入现有数据库

时间:2010-05-10 10:58:43

标签: php sql-server sql-server-2005 excel

我使用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

数据库已经有很多和建筑物,我需要导入一些检查。要点是:

  • 这是一次性初始加载。
  • 数据来自Excel文件。
  • Excel数据不知道数据库自动生成的ID:检查必须通过lot_code链接到建筑物

我可以选择执行此类数据加载吗?

date         inspector     result     lot_code
==========   ===========   ========   ========
31/12/2009   John Smith    Pass       987654X
28/02/2010   Bill Jones    Fail       123456B

更新:我最终如何做到了

如果其他人必须执行类似的任务,这些是最终需要数据加载的步骤:

  1. 准备Excel文件:删除不需要的列,为表格和列标题指定正确的名称等。

  2. 使用SQL Server Import / Export Wizard(32位版本; 64位版本缺少此功能),将每个工作表加载到(新)数据库表中。该向导负责(大部分)脏细节,包括创建适当的DB结构。

  3. 使用您喜欢的客户端登录数据库。为了简化SQL编码,我在新表中创建了一些额外的字段。

  4. 开始交易。

    BEGIN TRANSACTION;

  5. 更新新创建的表中的辅助列:

    UPDATE excel_inspection$ SET building_id = bu.building_id FROM building bu INNER JOIN ....

  6. 在目标表中插入数据:

    INSERT INTO inspection (...) SELECT ... FROM excel_inspection$ WHERE ....

  7. 如果一切正常,请查看结果并提交交易:

    COMMIT;

  8. 就我而言,SQL Server在使用现有表加入新表时抱怨了排序规则冲突。通过在新表中设置适当的排序规则来修复它,但方法不同:在SQL Server 2005中,我可以简单地从SQL Server管理器更改排序规则(单击,单击,保存和完成)但在SQL Server 2008中我必须设置排序规则在导入向导中手动(“编辑SQL”按钮)。

3 个答案:

答案 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年开始的,因此该信息可能会不再相关。

如果其他人必须执行类似的任务,则这些步骤是数据加载最终所需的步骤:

  1. 准备Excel文件:删除不需要的列,为工作表和列标题指定适当的名称,等等。

  2. 使用 SQL Server导入/导出向导(32位版本; 64位版本缺少此功能),将的每个工作表加载到(新)数据库表中。该向导将处理(大部分)脏的细节,包括创建适当的数据库结构。

  3. 使用您喜欢的客户端登录数据库。为了简化SQL编码,我在新表中创建了一些额外的字段。

  4. 开始交易。

    BEGIN TRANSACTION;
    
  5. 更新新创建的表中的辅助列:

    UPDATE excel_inspection$
    SET building_id = bu.building_id
    FROM building bu
    INNER JOIN ....
    
  6. 在目标表中插入数据:

    INSERT INTO inspection (...)
    SELECT ...
    FROM excel_inspection$
    WHERE ....
    
  7. 查看结果并在一切正常的情况下提交事务:

    COMMIT;
    

就我而言,SQL Server在将新表与现有表连接时抱怨排序规则冲突。通过在新表中设置适当的排序规则来解决此问题,但是方法有所不同:在SQL Server 2005中,我可以简单地从SQL Server管理器中更改排序规则(单击,单击,保存并完成),但是在SQL Server 2008中,我必须设置排序规则手动在导入向导中(“编辑SQL”按钮)。