sql - 在多个表中插入一行,并分别维护关系

标签 sql sql-server-2008 ssis

尝试使用 SSIS 将特定场景中的数据从 Excel 工作表插入到 4 个表中时,我有点迷失了。

我的 Excel 工作表的每一行都需要分成 3 个表。然后需要将标识列值插入到第四个映射表中以保存关系。如何使用 SSIS 2008 有效地实现这一目标?

请注意,在下面的示例中,已修复 col4 和 5 都进入第三个表的情况。

这是数据示例

Excel

col1  col2  col3  col4  col5
a     b     c     d     3
a     x     c     y     5

表1

PK  col
1   a
2   a

表2

PK    col1  col2
1     b     c
2     x     c

表3

PK  Col
1   d
2   3
3   y
4   5

map 表

PK   Table1_ID  Table2_ID  Table3_ID
1    1          1          1
2    1          1          2
2    2          2          3
2    2          2          4

即使只建议使用基于 SQL 的方法,我也很好,因为我没有任何授权只使用 SSIS。额外的挑战是,在表 2 中,如果存在相同的数据行,我想在映射表中使用该 ID,而不是插入重复的行!

最佳答案

多播是您正在寻找的组件。该组件采用输入源并将其复制为多个输出。在这种情况下,您可以拥有 Excel 源并复制流程以将数据插入到 Table1、Table2 和 Table3 中。

现在,棘手的部分是将这些身份返回到您的 Map_Table 中。您要么不使用 IDENTITY 并使用其他方式(例如 GUID,或者您自己的增量计数器,您将在多播之前将其设置为派生列),要么使用 @@IDENTITY检索最后插入的身份。使用@@IDENTITY对于你目前的情况来说,这对我来说听起来很痛苦,但这取决于你。如果数据不是那么大,我会选择 GUID。

@@IDENTITY不适用于批量操作。它将仅检索最后创建的身份。另外,请记住我谈到了 @@IDENTITY,但您可能想使用 IDENT_CURRENT('TableName')而是检索特定表的最后一个标识。 @@IDENTITY检索在 session 中创建的最后一个身份,无论范围如何。您可以使用SCOPE_IDENTITY()检索您范围内的最后一个身份。

关于sql - 在多个表中插入一行,并分别维护关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11470106/

相关文章:

python - 使用 Python 将 PostgreSQL 查询导出到 csv 文件

java - 使用 integratedSecurity(Windows 身份验证)通过 JDBC 从 Linux 连接到 SQL Server?

sql - 如何解密SQL Server 2008中的存储过程

SQL:将事件拆分为多行

ssis - 让 SSIS 检测 csv 文件的列大小

database - SSIS - 源错误输出(没有行将被发送到错误输出......)

sql - 插入随机字符串、数字。以及乘法的结果

SQL累进和

php - 我如何优化这个搜索结构?

ssis - 自动日期维度