1

我需要将 Excel 电子表格中的数据导入 SQL Server,但数据不是关系/规范化格式,因此导入向导不会删除它(据我所知)。

数据格式如下:

Category    SubCategory     Name        Description

Category#1  SubCategory#1   Product#1   Description#1
Category#1  SubCategory#1   Product#2   Description#2
Category#1  SubCategory#2   Product#3   Description#3
Category#1  SubCategory#2   Product#4   Description#4
Category#2  SubCategory#3   Product#5   Description#5

(抱歉,我缺乏在早上这个时候拿出“真实”数据的创造力......)

每行包含一个唯一的产品,但类别结构是重复的。我想将此数据导入三个表:

Category
SubCategory
Product

(我知道 SubCategory 应该真正包含在 Category 中,DB 不是我的设计)

我需要一种方法来根据类别导入唯一行,然后是子类别列,然后在将其他列导入产品时,根据名称获取对子类别的引用。

如果没有编写脚本,有没有办法使用导入向导或其他工具来做到这一点?

4

4 回答 4

3

不久前我遇到了类似的问题,但没有找到任何简单的方法来使用导入向导来做到这一点。我解决导入的方法(因为这是一项一次性任务,而不是会一直闲逛的事情)是从 excel 创建一个简单的宏(VBA),它会简单地调用一个存储的过程,使用每一行作为参数。

存储过程会智能地插入每个参数(列),然后抓取 ID 用作下一个参数插入的外键。

例如:

    声明 @CategoryID INT
    声明 @SubCategoryID INT

    -- 检查类别是否存在
    如果不存在(SELECT * FROM tblCategories WHERE CategoryName = @pCategoryName)
    开始

        -- 你的insert语句在这里,然后获取ID

        SET @CurrencyID = scope_identity()

    结尾
    别的
    开始

        -- 这里设置类别ID

    结尾

VBA 宏的代码类似于:

私有子 CommandButton1_Click()

    将 cnt 调暗为 ADODB.Connection
    将 wbBook 调暗为工作簿
    将 wsSheet 调暗为工作表
    将 intActiveRow 变暗
    将 intInsuranceProduct 调暗为变体

    ' 获取我们的连接
    设置 cnt = CreateConnection()

    ' 读取输入表
    设置 wbBook = ActiveWorkbook
    设置 wsSheet = wbBook.Worksheets(1)

    ' 忽略标题行
    intActiveRow = 2

    ' 将每一行处理到数据库中
     Do While (wsSheet.Cells(intActiveRow, 1) "")

         ' 执行存储过程,GenerateScript 会创建你的 SQL
         cnt.Execute (GenerateScript(wsSheet, intActiveRow))

         ' 为行数增加 i
         intActiveRow = intActiveRow + 1

     环形

    万一

    '打扫干净。

    cnt.关闭
    设置 cnt = 无
    设置 wbBook = 无
    设置 wsSheet = 无


结束子

于 2009-04-17T09:49:55.737 回答
2

您可能想要调查以前称为 DTS(数据转换服务)的SSIS (SQL Server 集成服务)。
在 SSIS 中,可以使用Excel 作为数据源,您可以在其中指定数据的过滤器和转换以加载到适当的 SQL Server 表中。这可能需要一些研究,但它是一个非常强大的工具,如果您需要做一些非开箱即用的事情,它还支持创建脚本任务的能力。

于 2009-04-17T09:55:21.980 回答
-1

实际上,专门为这种类型的工作开发的一个很好的软件是 Relational Excel - 有一个试用版,但它可以在试用期过后使用,它只是每隔一段时间显示一次唠叨屏幕。www.relationalexcel.com

于 2010-05-08T20:23:45.830 回答
-1

很快的解决方法是使用MS Access中的“分析表”工具,你的表将是Normalyze,试试吧!

于 2017-12-31T01:23:56.950 回答