Thursday, November 16, 2006

How to change object owner to dbo for several database objects at once

The output from the following SQL statement will generate code for any non-DBO onject and change the owner to dbo

SELECT 'EXEC(''sp_changeobjectowner @objname = '''''+ ltrim(u.name) + '.' + ltrim(s.name) + '''''' + ', @newowner = dbo'')' FROM sysobjects s, sysusers u WHERE s.uid = u.uid AND u.name <> 'dbo'AND xtype in ('V', 'P', 'U')AND u.name not like 'INFORMATION%'order by s.name

資料來源

Friday, November 03, 2006

Cannot resolve collation conflict for equal to operation

解決方法竟然是在每個 where 條件欄位後面加上 collate database_default 就好了。

Thursday, November 02, 2006

SQL Performance Tuning

今天接到一個 SQL Performance 的問題,聽說有個程式在做 Batch Update 時會有 Performance 不好的情形。後來查看原先的 Table,發現有建了一個Cluster Index與兩個Non-Cluster Index,內容如下:









後來在對一個 Update 指令進行 Estimated Execution Plan 分析時,結果如下:



直覺覺得應該是第二個 Index 當 Cluster Index 才對,於是就將第一,三個 Index 刪除,將第二個 Index 改為 Cluster Index,結果如下:



以此再對同一個 Update 指令進行 Estimated Execution Plan 分析時,結果如下:



看起來似乎有改善,而實際執行的結果,原先約需 7 秒執行完的指令,改善後大約只花了 1 秒就跑完了。

版本控制

昨天新版程式上線,原以為會很順利,但是發現順利並不是順理成章的。後來共發現了兩個錯誤。
首先是一個signed 與 unsigned 的問題。sBodyMsg 為一 CString,而此判斷式 if (sBodyMsg.GetAt(254) > 127) 當 GetAt(254) 傳回值大於 127 的 char 時,判斷結果並不正確。後來發現因為 127 會被轉為 int,所以大於 127 的 char 被轉為 int 時就變成負值了。
第二個是程式版本控制的問題。因為在改成新版本時,舊版本仍有新增功能,此時卻沒有同步更新新版程式,因此造成不該有的錯誤。
這次學到的教訓有,1.程式版本控制,確定新功能均有加入新版程式中;2.測試足夠的案例,包含程式中所有的判斷條件,確保在各種條件下均能運作正常。