我最近获得了更新我们数据库中单个表的权限,但这不是我以前做过的事情,而且我不会搞砸什么。我尝试在网上搜索类似于我想要做的事情而没有成功。
表名是dbo.Player_Miles,它只有两列数据Player_ID和Miles,两者都设置为(int,null)。
目前此表中有大约300K条记录,我需要使用csv文件来更新此表。在文件中有500k记录,所以我需要能够:
INSERT新记录~250k记录
更新具有新信息的记录~200K记录
保持不变并记录具有相同信息(虽然更新那些相同的东西不会伤害数据库将是我猜的资源生猪)~50K记录
同时保留当前表中未包含在更新文件中的任何记录。 ~50k记录
我正在使用SSMS 2008,但服务器是2000。
答案 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