用于插入新记录的SQL脚本

时间:2014-03-04 22:10:17

标签: sql sql-server stored-procedures

我有一个表,而有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存储过程没有太多线索。任何帮助表示赞赏!

2 个答案:

答案 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}的索引

Demo

注意: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代理作业。这是一个漫长且有些复杂的主题,快速的谷歌搜索应该会出现数十篇关于这个主题的专业文章。