Pages

2013年8月16日 星期五

T-SQL 取代Cursor操作

轉仔自 : RICO技術農場 自己在工作開發上(雖然很少開發...XD)遇到要執行一筆一筆的操作,
我會盡量避免使用Cursor來處理(效能會很差),而想其他方法來取代,
剛好看到網友詢問,這裡順手紀錄針對一筆一筆操作不使用Cursor做法。

需求:取得來源資料表col2欄位並依col1條件逐筆更新目的資料表c2欄位(@desttbl)

  1. declare
  2. @step int,
  3. @uplimit int,
  4. @currentid int,
  5. @maxcount int,
  6. @nextrowid int,
  7. @c1data int,
  8. @c2data varchar(30);
  9. set @uplimit=1000;
  10. set @step=1;
  11. --建立來源資料表
  12. declare @sourcetbl table
  13. (
  14. col1 int identity(1,1) primary key not null,
  15. col2 varchar(30) null
  16. )
  17. --建立目的資料表
  18. declare @desttbl table
  19. (
  20. c1 int not null,
  21. c2 varchar(30) null,
  22. c3 datetime
  23. )
  24.  
  25. --新增資料
  26. while(@step<@uplimit+1)
  27. begin
  28. set @c1data=FLOOR((@uplimit)*RAND());
  29. insert into @sourcetbl values('rico'+convert(varchar,@step));
  30. insert into @desttbl values(@c1data,'',getdate());
  31. set @step=@step+1;
  32. end
  33. select @maxcount=count(1) from @sourcetbl;
  34. select @currentid=min(col1) from @sourcetbl;
  35. --取得來源資料表col2欄位並依col1條件更新目的資料表c2欄位(@desttbl)
  36. while(@currentid<=@maxcount)
  37. begin
  38. select
  39. @currentid=col1,
  40. @c2data=col2
  41. from @sourcetbl
  42. where col1=@currentid;
  43. update @desttbl set c2=@c2data where c1=@currentid;
  44.  
  45. -- 取得下一筆資料
  46. SELECT @nextrowid = MIN(col1)
  47. FROM @sourcetbl
  48. WHERE col1 > @currentid ;
  49. set @currentid=@nextrowid;
  50. end
  51. --查看結果
  52. select * from @desttbl
  53.  

Related Posts:

  • 鎖的概述 一. 為什麼要引入鎖  多個使用者同時對資料庫的併發操作時會帶來以下資料不一致的問題:  丟失更新 A,B兩個使用者讀同一資料並進行修改,其中一個用戶的修改結果破壞了另一個修改的結果,比如訂票系統  髒讀 A使用者修改了資料,隨後B使用者又讀出該資料,但A使用者因為某些原因取消了對資料的修改,資料恢復原值,此時B得到的資料就與資料庫內的資料產生了不一致  不可… Read More
  • MS-SQL Server Log 檔清理方式 最近在刪除大筆資料時後發現,資料庫的LOG.LDF檔案會隨著刪除的比數增加,真是掰思不得其解。 於是上網尋找解決方案,總共有兩種。 1. 刪除法 第一步: 執行SQL語法,卸載資料庫:   EXEC   sp_detach_db   @dbname   =   'MYDBNAME' 第二步: 刪除MYDBNAME_Log.LDF 第三步: … Read More
  • 鎖的問題 在SQL Server中使用加鎖的問題,我就以前的經驗和收集的一些資料簡單的提出我自己的一些看法,不知道對啟明星是否有所幫助: 一般而言,下面是個典型的打開資料庫的過程。 <% ’游標類型 Const adOpenForwardOnly = 0 Const adOpenKeyset = 1 Const adOpenDynamic =&nb… Read More
  • SQL LOCK 簡易描述LOCK提示描述: HOLDLOCK將共用鎖保留到事務完成,而不是在相應的表、行或資料頁不再需要時就立即釋放鎖。HOLDLOCK等同於SERIALIZABLE。 NOLOCK不要發出共用鎖,並且不要提供排它鎖。當此選項生效時,可能會讀取未提交的事務或一組在讀取中間回滾的頁面。有可能發生髒讀。僅應用於SELECT語句。 PAGLOCK在通常使用單個表鎖的地方採用頁鎖。 READCOMMITTED用與運行在提交讀隔離級別的事務相同的鎖語義… Read More
  • 關於資料庫加鎖的知識 LockType 屬性 指示編輯過程中對記錄使用的鎖定類型。 設置和返回值 設置或返回以下某個 LockTypeEnum 的值。 常量 說明 adLockReadOnly 預設值,唯讀。無法更改資料。 adLockPessimistic 保守式記錄鎖定(逐條)。提供者執行必要的操作確保成功編輯記錄,通常採用編輯時立即鎖定資料來源的記錄的方式。 adLo… Read More

0 意見: