SQL Server 2005學(xué)習(xí)筆記之?dāng)?shù)據(jù)修改心得
SQL Server 2005數(shù)據(jù)庫(kù)操作中,數(shù)據(jù)修改操作是我們經(jīng)常要使用的,因此是必須要掌握的。以前為了動(dòng)態(tài)返回sp或批處理的結(jié)果,做為下一步處理的中繼數(shù)據(jù),總是使用臨時(shí)表和openQuery來(lái)實(shí)現(xiàn)。有時(shí)還實(shí)現(xiàn)不了,比如需要指定參數(shù)的sp.其實(shí)有INSERT EXEC很好解決我的這些困擾。Insert Exec 語(yǔ)句可以把存儲(chǔ)過(guò)程或動(dòng)態(tài)批處理返回的結(jié)果集直接保存到現(xiàn)有表中:INSERT INTO <target_table> EXEC {<proc_name> | (<dynamic_batch>)};
例如:
- INSERT INTO DBO.Result
- EXEC DBO.USP_MYSP @Parm1='A',@Parm2='B'
刪除數(shù)據(jù)只知道TRUNCATE和無(wú)WHERE DELETE區(qū)別。TRUNCATE日志最小化不觸發(fā)TRIGGER,所以要比日志全記錄的無(wú)WHERE DELETE要快。刪除大量數(shù)據(jù)的操作,肯定要指定WHERE的,能做的就是寫(xiě)好語(yǔ)句,等著執(zhí)行完畢。在執(zhí)行過(guò)程會(huì)發(fā)生日志暴漲,鎖升級(jí)等狀況卻沒(méi)有考慮到。
假設(shè)MYTB是***的表,要?jiǎng)h除其中幾百萬(wàn)行,老辦法會(huì)執(zhí)行很久必然會(huì)有阻塞發(fā)生??梢杂萌缦路椒ǎ?/p>
- WHILE 11=1
- Begin
- Delete TOP(5000) From dbo.MYTB
- Where myCol='del';
- IF @@ROWCOUNT<5000
- BREAK;
- End
這樣第次刪除5000行,當(dāng)刪除到***一批數(shù)據(jù),不足5000行就跳出。鎖升級(jí)的可能大大降低。移除重復(fù)性數(shù)據(jù),這是一個(gè)老話題了,針對(duì)行重復(fù)、部分列重復(fù),無(wú)非就是DISTINCT,主鍵,臨時(shí)表之類(lèi)的處理方法,在SQL2005里新引入的CTE和ROW_NUMBER函數(shù)可以提供一個(gè)清晰和清新的解決方法:
假設(shè)MYTB沒(méi)有主鍵列,有部分重復(fù)數(shù)據(jù)需要?jiǎng)h除,則可以:
- WITH DUPS AS
- (
- SELECT *,ROW_NUMBER() OVER (ORDER BY COL1,COL2,COL3) AS RN
- FROM DBO.MYTB
- )
- DELETE FROM DUPS WHERE RN>1
關(guān)于SQL Server 2005數(shù)據(jù)修改的心得就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】






