2014-10-08 70 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