我有一个表,而有5百万条记录可用,每天记录添加20000到50000.我想创建脚本,我可以保留旧记录,并在现有表中每天添加所有新记录。我正在使用SQL Server 2008R2。
+------------+----------+-------------+-------------+
| Date | Activity | COnversions | Impressions |
+------------+----------+-------------+-------------+
| 03/03/2014 | Book | 52 | 1000 |
| 03/03/2014 | Mobile | 100 | 5000 |
| 03/04/2014 | Book | 60 | 4500 |
| 03/04/2014 | Mobile | 40 | 6000 |
| 03/05/2014 | yahoo | 58 | 2000 |
| 03/05/2014 | MSN | 46 | 1500 |
+------------+----------+-------------+-------------+
以上是现有表格。
New data:
+------------+--------+-----+-------+
| 03/03/2014 | Book | 52 | 1000 |
| 03/03/2014 | Mobile | 100 | 5000 |
| 03/04/2014 | Book | 60 | 4500 |
| 03/04/2014 | Mobile | 40 | 6000 |
| 03/05/2014 | yahoo | 58 | 2000 |
| 03/05/2014 | MSN | 46 | 1500 |
| 03/06/2014 | Book | 93 | 7000 |
| 03/06/2014 | Google | 97 | 15000 |
+------------+--------+-----+-------+
现在如果你注意到03/06/2014的日期是原始表中的新记录,我想只将这些新记录插入到上面的事实表中,而我在商店程序。
问题:如何通过SQL Server Management Studio自动完成此过程(SQL脚本)?而我可以自动输入所有新记录,并防止现有数据加倍。
我打算编写此脚本,并希望通过 SSIS和SQL Server代理使此过程自动化,但对 SQL存储过程没有太多线索。任何帮助表示赞赏!
答案 0 :(得分:2)
因此,日期和活动似乎是候选复合键。使用它你可以构建以下
MERGE CurrentData as target
USING NewData as source
ON (target.date = source.date
and target.activity = source.activity)
WHEN NOT MATCHED THEN
INSERT (Date, Activity, Conversions, Impressions)
VALUES (source.Date, source.Activity, source.Conversions, source.Impressions);
根据您拥有的记录数量,我确保您在两个表上都有{date, activity}
的索引
注意:CurrentData和NewData需要替换为实际的表名
答案 1 :(得分:2)
基于以下内容的东西应该有效:
INSERT MyTable (Date, Activity, Conversions, Impressions)
select Date, Activity, Conversions, Impressions
from RawTable
except select Date, Activity, Conversions, Impressions
from MyTable
这将:
缺点是数百万行表上的表扫描很难看,但如果没有索引或仔细规划,你就无法做到这一点。
将其转换为基本存储过程非常简单:
CREATE PROCEDURE LoadNewData
AS
INSERT MyTable (Date, Activity, Conversions, Impressions)
select Date, Activity, Conversions, Impressions
from RawTable
except select Date, Activity, Conversions, Impressions
from MyTable
GO
这里有很多铃声和口哨声(Nocount,错误处理,返回代码,活动记录等等),这在很大程度上取决于你想要或者需要做什么,而不仅仅是加载数据。
至于通过SSMS实现自动化,您需要查看SQL代理作业。这是一个漫长且有些复杂的主题,快速的谷歌搜索应该会出现数十篇关于这个主题的专业文章。