首页 > 解决方案 > 使用 SSIS 的 Excel 电子表格中没有唯一列的 SQL Server 表

问题描述

我正在从导出的 CRM 数据创建数据库。到目前为止,每个导出都有一个可用作主键的唯一列或可用于创建复合主键的列组合。

我有一个数据集实际上具有合法的重复行并且没有列 ID 或标识每一行的唯一方法。

我正在创建的过程是相当自动化的。我有一个放置电子表格的 Sharepoint 位置和从这些工作表中提取数据并将它们加载到数据库中的 SSIS 包。我需要一种方法来为可以复制的行创建一个键,以防止上传已经存在的重复行。

我想过可能创建一个计算列,将一个数字连接到一个复合键上,以显示这是该数据的第一次出现,依此类推。因此,如果出现两次,则会上传 Col1_Col2_Col3_1 和 Col1_Col2_Col3_2。因此,如果该工作表没有在 Sharepoint 上及时更改,那么这两个事件将不会被上传。

是否可以计算集合中某一行的出现次数,而不仅仅是该行数据的总出现次数?我真的很迷茫,需要一个坚实的地方来解决这个似乎几乎不可能的问题。我对任何解决方案持开放态度,无论是 SSIS 中的 C# 脚本,还是在服务器端完成,只要我能提出一个随着时间推移可靠的解决方案,我都会实施它。

标签: sql-serverexcelssissql-server-data-tools

解决方案


您可以将数据按原样(带有重复项)加载到 sql 中的工作表中,然后使用row_number()

create table HasDuplicates(i int, j int, k int);

-- load in your data, I'll just do some inserts with one duplicate pair:
insert HasDuplicates(i, j, k) values (1, 2, 3), (1, 2, 3), (2, 3, 4)

-- generate "uniqueified" data. Since the "order by" is irrelevant, I'll just use a constant
select   i, j, k, instance = row_number() over (partition by i, j, k order by (select 1))
--into     Deduplicated <- uncomment this to save the result as a new table
from     HasDuplicates

推荐阅读