今天真汗顔啊。。。。由于我的一不小心,我把幾百萬條資料給删了,囧。客戶的幾年重要資料就這樣沒了,我當時愁的,還好後來找回來了。
對于大資料的操作,大家一定要慎重操作。
在SQLServer2005中,想從一個資料庫伺服器遷移一個資料表的資料到另一資料庫伺服器的表中,大家一般會怎麼做呢?
我先來說說我今天的做法:(因為自己的筆記本上沒有裝軟體,不能截圖給大家看了,大家可以自己動手操作下)
剛開始我利用一種方法,很笨且不安全的,大家引以為戒。
老大交給我任務了,我一想那麼多資料,總不能一條一條手工插入吧。我思考了一段時間,我決定利用SQLServer的自帶工具,右鍵點選,導入/導出資料功能。先用T-SQL語句根據條件篩選出需要的資料,在一台資料庫伺服器上操作,将查詢出的資料右鍵另存為.rpt和.txt格式的檔案。然後在另一個伺服器上導入這些資料。當我操作前幾個表的資料正常的時候,我還洋洋得意,到了最後一個表時發現導入的資料再遇到datetime類型時,發現傻眼了,前幾十條資料正常導入,到了後面的一條資料以後,後面的幾萬條資料導不了了啊,有木有?囧!這是為什麼呢?我檢查了下資料,發現到那條卡殼的資料時,那裡有個null值。嗯???為什麼空就不能導入了?varchar和datetime類型的差別,我想大家都知道吧。對,問題就出在這。當我們把資料導出去的時候,那些資料最嚴重的缺點就是少了字段描述了,全變成了varchar類型了。不信的話,你用導入工具導入到一個新表裡試試(這裡沒法截圖,大家自己可以試試),你會發現預設的資料都成varchar類型了。悲劇,這個方法遺憾失敗!
正确的做法是:
一、 用T-SQL語句建立一個臨時表,這個表和你需要導出資料表的字段定義一樣。假設我們要導出的資料庫表為A,那麼這個臨時表叫A_Temp。
<a href="http://blog.51cto.com/attachment/201211/215157978.jpg" target="_blank"></a>
看T-SQL語句:
INSERT INTO A_Temp SELECT * FROM A WHERE 1 = 1 AND BeginTime > ’2012-11-05 00:00:00’ AND BeginTime < ‘2012-11-06 00:00:00’
将篩選出來的資料拷貝到A_Temp表中。
再在另一個資料庫伺服器上操作:
<a href="http://blog.51cto.com/attachment/201211/215326179.jpg" target="_blank"></a>
用T-SQL語句建立一個臨時表,這個表和你需要導出資料表的字段定義一樣。
二、 利用SQLServer導入導出工具将22的資料庫表A_Temp導入到23的資料庫表B_Temp中,現在再将B_Temp表中的資料添加到B表中。這樣就搞定了。
INSERT INTO B SELECT * FROM B_Temp
總結這樣的好處:
1) 可以很清楚明白的知道你要導出的資料,友善後來維護查詢;
2) 不會出現資料類型對不上的情況,當時是因為自己的粗心大意,在查詢資料的時候把Delete看成了Select執行了,結果導緻嚴重的後果,差點就賠錢了啊。汗。。。
3) 思路明确,嚴謹。
好了,今天的總結就到這,學無止境,工作中一定要心細。大家在操作大數量的資料時,每當使用Update、Delete、Insert時一定要考慮好,重新檢查一遍,想想你正在做什麼?不要一失足成千古恨,到時候悔之晚矣。
本文轉自shyy8712872 51CTO部落格,原文連結:http://blog.51cto.com/shuyangyang/1050935,如需轉載請自行聯系原作者