将从Excel导出的非规范化关系数据导入到SQL Server中
我需要从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不是我的devise)
我需要一种方法来导入基于Category和SubCategory列的唯一行,然后在将其他列导入Product时,根据名称获取对SubCategory的引用。
没有脚本编写这个,有没有办法使用导入向导或其他工具来做到这一点?
我前一段时间遇到类似的问题,并没有find使用导入向导来完成此操作的简单方法。 我解决导入的方式(因为这是一个一次性的任务,而不是一直要绕过的)是从Excel中创build一个简单的macros(VBA),只需调用一个存储过程,使用每行作为参数。
存储的proc将智能地插入每个参数(列),然后抓取该ID作为下一个参数插入的外键。
例如:
DECLARE @CategoryID INT DECLARE @SubCategoryID INT - 检查类别是否存在 IF NOT EXISTS(SELECT * FROM tblCategories WHERE CategoryName = @pCategoryName) 开始 - 你的插入语句在这里,然后抓住ID SET @CurrencyID = scope_identity() 结束 其他 开始 - 在这里设置类别ID 结束
VBAmacros的代码类似于:
Private Sub CommandButton1_Click() 昏暗的cnt作为ADODB.Connection 昏暗的wbBook作为工作簿 昏暗的wsSheet作为工作表 Dim intActiveRow As Long Dim intInsuranceProduct As Variant “得到我们的连接 设置cnt = CreateConnection() '阅读input表 设置wbBook = ActiveWorkbook 设置wsSheet = wbBook.Worksheets(1) '忽略标题行 intActiveRow = 2 '处理每一行到数据库中 做(wsSheet.Cells(intActiveRow,1)“”) '执行存储过程,GenerateScript将创build你的SQL cnt.Execute(GenerateScript(wsSheet,intActiveRow)) “我增加行数 intActiveRow = intActiveRow + 1 循环 万一 '打扫干净。 cnt.Close 设置cnt = Nothing 设置wbBook = Nothing 设置wsSheet = Nothing 结束小组
您可能想要调查以前称为DTS(数据转换服务)的SSIS (SQL Server Integration Services)。
在SSIS中,可以使用Excel作为数据源 ,您可以指定数据的filter和转换以加载到相应的SQL Server表中。 这可能需要一点研究,但它是一个非常强大的工具,并且还支持创build一个脚本任务,如果你需要做的事情不是开箱即用的能力。
实际上,一个专门为此类工作开发的好软件是Relational Excel – 有一个试用版,但它可以在试用期过后使用,每隔一段时间就会显示一次。 http://www.relationalexcel.com