第一次更新表格

时间:2014-10-08 15:20:06

标签: sql-update sql-insert

我最近获得了更新我们数据库中单个表的权限,但这不是我以前做过的事情,而且我不会搞砸什么。我尝试在网上搜索类似于我想要做的事情而没有成功。

表名是dbo.Player_Miles,它只有两列数据Player_ID和Miles,两者都设置为(int,null)。

目前此表中有大约300K条记录,我需要使用csv文件来更新此表。在文件中有500k记录,所以我需要能够:

INSERT新记录~250k记录

更新具有新信息的记录~200K记录

保持不变并记录具有相同信息(虽然更新那些相同的东西不会伤害数据库将是我猜的资源生猪)~50K记录

同时保留当前表中未包含在更新文件中的任何记录。 ~50k记录

我正在使用SSMS 2008,但服务器是2000。

2 个答案:

答案 0 :(得分:1)

您应该使用SSIS(或DTS,它在SQL Server 2005中被SSIS取代)。 使用CSV作为源,并将数据“插入”目标表。

在SSIS中,有不同的方法可以完成这项任务。

一种简单的方法是在Player_ID上使用查找任务。 如果匹配更新了值,如果没有匹配则只需插入新值。

See this link for more informations on lookup-pattern-upsert

答案 1 :(得分:1)

你可以分阶段解决这个问题......

1)备份数据库

2)创建一个临时SQL表来保存更新记录

create table Player_Miles_Updates (
    PlayerId int not null,
    Miles int null)

3)将文本文件中的记录加载到临时表

bulk insert Player_Miles_Updates
   from 'c:\temp\myTextRecords.csv'
   with
     (
        FIELDTERMINATOR =' ,',
        ROWTERMINATOR = '\n'
      )

4)开始交易

begin transaction

5)插入新数据

insert  into Player_Miles
select  PlayerId, Miles
from    Player_Miles_Updates
where   PlayerId not in (select PlayerId from Player_Miles)

6)更新现有数据

update  Player_Miles
set     Player_Miles.Miles = pmu.Miles
from    Player_Miles pm join Player_Miles_Updates pmu on pm.Player_Id = pmu.Player_Id

7)选择几行以确保您想要发生的事情,发生了

select  *
from    Player_Miles
where   Player_Id in (1,45,86,14,83) -- use id's that you have seen in the csv file

8a)如果一切顺利

commit transaction

8b)如果一切顺利的话

rollback transaction

9)删除临时表

drop table Player_Miles_Updates