将Excel中的非规范化关系数据导入SQL Server

时间:2009-04-17 09:28:06

标签: sql-server excel import etl

我需要将数据从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

(道歉,我在早上的这个时候缺乏创造'真实'数据的创造力......)

每一行都包含一个独特的产品,但cateogry结构是重复的。我想将这些数据导入三个表:

Category
SubCategory
Product

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

我需要一种基于Category和SubCategory列导入唯一行的方法,然后在将其他列导入Product时,根据名称获取对SubCategory的引用。

没有脚本编写,有没有办法使用导入向导或其他工具?

4 个答案:

答案 0 :(得分:3)

前一段时间我遇到过类似的问题,并且使用导入向导找不到任何简单的方法。我解决导入的方式(因为这是一个一次性的任务,而不是一些可以解决的问题)是从excel创建一个简单的宏(VBA),它只是调用存储过程,使用每一行作为参数。

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

例如:


    DECLARE @CategoryID INT
    DECLARE @SubCategoryID INT

    -- Check that the Category exists
    IF NOT EXISTS (SELECT * FROM tblCategories WHERE CategoryName = @pCategoryName)
    BEGIN

        -- Your insert statement here, then grab the ID

        SET @CurrencyID = scope_identity()

    END
    ELSE
    BEGIN

        -- Set the category ID here

    END

VBA宏的代码类似于:


Private Sub CommandButton1_Click()

    Dim cnt As ADODB.Connection
    Dim wbBook As Workbook
    Dim wsSheet As Worksheet
    Dim intActiveRow As Long
    Dim intInsuranceProduct As Variant

    ' Get our connection
    Set cnt = CreateConnection()

    ' Read the input sheet
    Set wbBook = ActiveWorkbook
    Set wsSheet = wbBook.Worksheets(1)

    ' Ignore the header row
    intActiveRow = 2

    ' process every row into the database
     Do While (wsSheet.Cells(intActiveRow, 1)  "")

         ' execute the stored procedure, GenerateScript would create your SQL
         cnt.Execute (GenerateScript(wsSheet, intActiveRow))

         ' increment i for row count
         intActiveRow = intActiveRow + 1

     Loop

    End If

    'Cleaning up.

    cnt.Close
    Set cnt = Nothing
    Set wbBook = Nothing
    Set wsSheet = Nothing


End Sub

答案 1 :(得分:2)

您可能希望调查以前称为DTS(数据转换服务)的SSIS(SQL Server Integration Services)。
在SSIS中,可以使用Excel as a data source,您可以在其中指定数据的过滤器和转换,以便加载到相应的SQL Server表中。它可能需要一些研究,但它是一个非常强大的工具,并且还支持创建脚本任务的能力,如果你需要做一些不是开箱即用的事情。

答案 2 :(得分:-1)

实际上,专门为此类工作开发的一个好的软件是Relational Excel - 有一个试用版,但它可以在试用期之后使用,它只是偶尔显示唠叨屏幕。 www.relationalexcel.com

答案 3 :(得分:-1)

解决方案非常快,就是在MS Access中使用“分析表”工具,你的表将是Normalyze,试试吧!