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