【发布时间】:2012-05-22 14:08:47
【问题描述】:
我有以下表格:
DataValue
DateStamp ItemId Value
---------- ------ -----
2012-05-22 1 6541
2012-05-22 2 12321
2012-05-21 3 32
tmp_holding_DataValue
DateStamp ItemId Value
---------- ------ -----
2012-05-22 1 6541
2012-05-22 4 87
2012-05-21 5 234
DateStamp 和 ItemId 是主键列。
我正在执行全天定期运行的插入操作(在存储过程中):
insert into DataValue(DateStamp, ItemId, Value)
select DateStamp, ItemId, Value from tmp_holding_DataValue;
这会将数据从保留表 (tmp_holding_DataValue) 移动到主数据表 (DataValue)。然后保留表被截断。
问题在于,在示例中,holding 表可能包含主表中已经存在的项目。由于键不允许重复值,因此过程将失败。
一种选择是在插入过程中放置一个 where 子句,但主数据表有 1000 万多行,这可能需要很长时间。
有没有其他方法可以让程序在尝试插入时跳过/忽略重复项?
【问题讨论】:
-
如果保持表中的
Value列不同怎么办,例如第一行是3253而不是6541?这仍然是重复的吗?如果不是,是您想要更新的内容(例如在源表中添加6541 + 3253)还是直接替换? -
值列无关紧要,如果它不同,则忽略它,该日期戳的 DataValue 中的内容应保持原样
-
用您需要支持的 SQL Server 的最低 版本 标记您的问题也非常有用。我没有提供
MERGE解决方案,因为最初我完全不知道您使用的是什么版本。 -
@AaronBertrand - 是的,我应该提到我使用的是 2008 年(很快就会转移到 2012 年)。在那种情况下,你会在哪里合并吗?
-
我不确定,我仍然觉得
MERGE语法令人生畏,而且我一般都不愿意推荐它。我不确定是否所有的 MERGE 错误都已修复(请参阅 list referenced by Alex K in his answer to this 2012 question)。如果您的主要目标是性能,那么由您来测试它们并确保 (a) 它们做正确的事情并且 (b) 您选择在您的环境中表现最好的 on。我们无法预测这些答案...
标签: sql-server sql-server-2008 tsql stored-procedures