问题是我将数据导入到关系表中,其中数据源是XML文件+ XSD架构。 XML源具有多个输出,并且节点之间的关系由SSIS在列中创建为order_id(生成的主键值不在XML中),并且假设订单详细信息我们获得外键order_id。
文件被导入,我们在命令和订单详细信息之间具有正确的参照完整性,但密钥在每个文件中只是唯一的,因此如果再次导入相同的文件,则由ssis生成/使用相同的ID。
如何确保唯一性/控制id的生成方式。
我曾尝试在订单表中使用标识列作为order_id,但它不会传播到参考表,如订单详情......
如果我们有
示例<order some attributes ...>
<orderdetails some attributes ...></orderdetails>
<orderdetails some attributes ...></orderdetails>
</order>
如果我们让ssis导入行,我们会得到类似的结果:
订单表
order_id = 4,其余数据列
orderdetails表
第1行orderdetail列,order_id = 4 第2行orderdetail列,order_id = 4
一切都好,但我不明白如何生成明显的半随机id = 4
如果使用增量密钥,我会得到(假设种子从1开始)
订单表
order_id = 1,其余数据列
orderdetails表
第1行orderdetail列,order_id = 4&lt; - 与先前生成的SSIS相同 第2行orderdetail列,order_id = 4&lt; - 与先前生成的SSIS相同
我希望外键的id为1,因此我想在导入XML数据时,为了保持引用完整性,我错过了一些中间步骤/设置。
任何指针都将受到高度赞赏。
答案 0 :(得分:0)
我建议您像往常一样导入标题,使用IDENTITY生成内部唯一键。您还应该将SSIS生成的密钥导入到同一个表中。
现在将详细信息导入单独的临时表,同样保留SSIS生成的密钥。
现在使用原始标头表从SSIS生成的密钥映射到唯一密钥。
要执行此操作,请使用以下内容更新临时表中的空白字段:
UPDATE LineStaging
SET Unique_Key = Header.UniqueKey
FROM Header
WHERE Header.SSISKey = LineStaging.SSISKey
现在,您的Unique_Key字段包含正确的外键。您可以将这些分阶段记录复制到“真实”行表中:
INSERT INTO Line SELECT * FROM LineStaging
可能有一种方法可以在SSIS中动态执行此操作,但我更喜欢SQL方法。
答案 1 :(得分:0)
请参阅以下链接,这些链接可帮助您了解如何向代码添加密钥
http://msdn.microsoft.com/en-us/library/d8wa0tw7(v=vs.71).aspx
http://msdn.microsoft.com/en-us/library/961cwet7(v=vs.71).aspx
希望这可能有用