2014-10-08 113 views
0

我最近被授予了更新数据库中的单个表的权限,但这不是我以前做过的事情,我也不会搞砸任何东西。我试图寻找网上的东西,这与我想要做的没有成功相似。第一次更新表格

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

当前这个表中有大约300K条记录,我有一个csv文件需要用来更新这个表。在该文件中有50万条记录,所以我需要能够:

插入新记录〜25万的记录

UPDATE与记录有新的信息〜200K记录

保留不变,并记录在案有相同的信息(虽然更新这些相同的东西不会伤害数据库将是一个资源猪我猜)〜50K记录

也保留不触及任何记录在表中目前不在更新的文件中。 〜50K的记录

我使用SSMS 2008年,但服务器2000

+0

这是一个非常简单的工作来备份你的数据库,并将其还原到不同的实例。然后你可以练习你喜欢的所有东西,直到你确定你的过程,然后再试着使用你的脚本。 – paul 2014-10-08 15:25:59

回答

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 
+0

这看起来像我想要的,所以我现在正在测试它。虽然我在步骤2中有一个问题,如果我们正在制作临时表,如果它没有名称前的# – 2014-10-08 16:20:33

+0

是的,您可以在前面使用'#'。这将使它成为一个真正的临时表(即,如果关闭了正在工作的窗口,它将消失)。 – paul 2014-10-08 16:26:01

+0

当我执行第3步时,出现以下错误消息170,级别15,状态1,行6 行6:'\ n'附近语法不正确。 – 2014-10-08 16:50:20

1

您应该使用SSIS(或DTS,这是在SQL Server 2005中替换SSIS)。 使用CSV作为源,并将数据“插入”到目标表。

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

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

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

+0

我也喜欢这个想法,将来会看到它,但现在我不知道如何使用SSIS,因为我对SQL还很陌生,只知道一些关于SSMS的基本知识。 – 2014-10-08 16:47:59