標籤:
需求是這樣的,在SQL SERVER中的Stock庫下,有兩千多張表。需要每張表都刪除今天的一條錯誤資料。
首先得要得到所有表的名稱,代碼如下:
Select name FROM SysObjects Where XType=‘U‘ and name <>‘InsertHistory‘ order BY Name ;
SysObjects是一張系統資料表,它會記錄在資料庫內建立的每個對象(約束、預設值、日誌、規則、預存程序等)在表中佔一行。只有在 tempdb 內,每個臨時對象才在該表中佔一行。 如果對SysObjects比較敢興趣的話,可轉到我之前發布的文章,SQL Server中的系統資料表sysobjects使用方法,實現迴圈遍曆所有表(轉)
接下來是遊標的使用。
在關聯式資料庫中,我們對於查詢的思考是面向集合的。而遊標打破了這一規則,遊標使得我們思考方式變為逐行進行.對於類C的開發人員來著,這樣的思考方式會更加舒服。
想繼續瞭解遊標的,請轉:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html
用法請看我在下面的注釋。
1 declare @tbName varchar(20);--定義遊標每一行的資料臨時變數 2 declare mycursor cursor --定義一個全域遊標,全域遊標可直接賦值,但結尾必須手動釋放掉。 3 for 4 Select name FROM SysObjects Where XType=‘U‘ and name <>‘InsertHistory‘ order BY Name ;--為遊標賦值賦值 5 open mycursor 6 7 fetch next from mycursor into @tbName; --第一行賦值給臨時變數 8 while 9 @@FETCH_STATUS=010 begin11 exec(‘delete from ‘+@tbName+‘ where datediff(day,[Time],getdate())=0;‘);12 fetch next from mycursor into @tbname; 13 end 14 --關閉遊標15 close mycursor16 --釋放遊標17 deallocate mycursor
最後想對使用遊標時提一些建議
- 如果能不用遊標,盡量不要使用遊標
- 用完用完之後一定要關閉和釋放
- 盡量不要在大量資料上定義遊標
- 盡量不要使用遊標上更新資料
- 盡量不要使用insensitive, static和keyset這些參數定義遊標
- 如果可以,盡量使用FAST_FORWARD關鍵字定義遊標
- 如果只對資料進行讀取,當讀取時只用到FETCH NEXT選項,則最好使用FORWARD_ONLY參數
關於sql server動態擷取資料庫下所有表以及遊標的簡單使用