2011/11/15

Trap of SQL "else if" : 關於 SQL 語法 "else if" 的陷阱

今天在工作上看到了一段 SQL 碼,大概是寫著
if @str='a'
    @result=@result+'aaa'
else if @str='b'
    @result=@result+'bbb'
else if @str='c'
    @result=@result+'ccc'
這勾起我的一段回憶,不過有點忘了原因,只記得因為那次的原因,讓我以後在寫 SQL 的 if...else 時,都一定會加上 begin...end

但現在想想,忘了原因卻還繼續堅持加上 if...else 的 begin...end 以後要求別人照做時似乎也站不住腳,因此決定追本朔源並整理出來。

2011/07/23

Mac 版 Pinball HD 購買心得

在好奇心的驅使下買了 Mac 版的 Pinball HD 這個我在 iPhone 上很愛玩的一款遊戲。好奇的是,它會怎麼樣的將 iPhone 上好用的操作改到 Mac 上,比如用手點 iPhone 螢幕左右面代表控制彈珠台的左右小板,發射彈珠就是拉下彈珠下方的彈簧到底後放開,搖動 iPhone 就會搖動彈珠台,讓我覺得操作起來很直覺自然,也因此對於是否會將相同的概念整合到 MacBook 的觸控板有著期待。

2011/06/01

Spring.NET Objects Checker 用來檢查你的 spring-objects.xml 內容是否正確

這幾天花了點時間寫了這個工具,主要原因是自從我在新公司開始接觸 Spring.NET 後,
在於團隊開發後的除錯(Debug)上,有時候會在 Spring.NET 的物件定義 XML 設定檔這
花上不少時間,大概情形如下,

『用了 Spring.NET 的 XML 設定後,衍生的特性是
「建置(Build)成功的定義不一樣了」,
原本的建置成功代表的是「程式中類別、方法的定義,使用端的呼叫都正確」,
現在的建置成功只有代表「程式中類別、方法的定義都合乎語法」,
「使用端的呼叫是否正確?」請執行已建置好的執行檔或網頁,We will see.
這產生了一個新的現象,專案開發中,發生
「建置成功,但不能執行」的機會提高了,變得更容易發生的原因可以很簡單,
例如:
 我寫了某支規格的 Dao.cs, IDao.cs, Domain.cs, Service.cs, IService.cs, (Spring)Objects.xml, Core.csproj, UI.aspx,
建置並執行沒問題後,Commit 到 Subversion 時漏掉了其中一個或以上的檔案(通常是 Core.csproj), 然後繼續做下一支規格。(這代表的是,下一個 Commit 的人要倒霉了,不,也許是下下下一個 Commit 的人)」
至於下一個 Commit 的人為什麼會倒霉,這邊我就不詳述了。

而我對於這個情形的結論是「在還沒有適當的工具可以一次找出 objects.xml 中的錯誤之前,就只能請 Program Analyst 的要求再多一點了』
以上,既然還沒有適當的工具,那麼...就自己寫吧!

2011/05/19

Interface Version of SqlHelper (參數都改為介面型態)

心血來潮,想試試看能不能把之前我很喜歡用但又很久沒用的 SqlHelper 改成介面 (interface) 的版本,也許讓它能在我目前的公司生存下去。

本來想說搜尋看看有沒有人已經改過一樣的東西,找了一下沒找到,那就自己來吧。
主要也只是做一些改名字的動作,變動如下,

2011/04/27

Effective Optional Parameters in MS SQL Use Like: 續上篇追縱報告

<< 前期提要 在這 >>
在前天發現使用「like '%'+@LastName+'%'」會讓執行計劃(Execution Plan)跑出索引搜尋(Seek)後,因為我還是無法確定這是否是有效的,鼓起勇氣在隔天中午寫了封信詢問公司的前輩Sky大大,終於在當天下午5點多,應該是很繁忙的Sky大回了信給我,肯定了我的測試,並且也幫我修正了一個小地方,而修正後的查詢指令(SQL Script)才真正的用到 Seek,信中指令如下:

2011/04/25

關於 SQL Server 執行 like 時的索引使用的有趣情形

今天在複習SQL效能調校內容時遇到一個有趣的情形,我不確定這是不是對效能真的有幫助或也許只是SQL Server的一個bug,總之,先記錄下來,詳情如下,
--測試環境:
--SQL Server 2008 Standard Edition x86
--SQL Server 2005 SP2 Developer Edition x86
use AdventureWorks
go
--在Person.Contact建立個Covering Index
create index icl_LastName_Title on Person.Contact(LastName, Title)
 include(ContactID, FirstName)
go
--1. 會用索引搜尋(seek)
select 
 ContactID, Title, LastName, 
 FirstName
from Person.Contact
where LastName like 'Adams%'
 and Title like 'Mr%'

--2. 會用索引掃描(scan), 所以每個教學在測完1,2後提醒大家like時不要用前面的'%'
select 
 ContactID, Title, LastName, 
 FirstName
from Person.Contact
where LastName like '%Adams%'
 and Title like '%Mr%'

--3. 會用索引掃描(scan), 這個先放著,是為了4,5對照用
select 
 ContactID, Title, LastName, 
 FirstName
from Person.Contact
where LastName like '%%'
 and Title like '%%'

--等等要用的變數
declare @LastName nvarchar(50)
declare @Title nvarchar(8)
set @LastName='' --'Adams'
set @Title='' --'Mr.'

--4. 常用的選擇性查詢條件的做法, 會用索引掃描(scan)
select 
 ContactID, Title, LastName, 
 FirstName
from Person.Contact
where (LastName like '%'+@LastName+'%' or @LastName='') 
 and (Title like '%'+@Title+'%' or @Title='')

--5. *有趣的事在這邊*
--   把4.的「or @xxx=''」拿掉後, 目的還是相同的, 
--   而且@xxx在空字串''的情況下, 5.和3.應該是一樣的, 
--   但是, 5.會用索引搜尋(seek)+巢狀迴圈內部聯結(join)
select 
 ContactID, Title, LastName, 
 FirstName
from Person.Contact
where LastName like '%'+@LastName+'%'
 and Title like '%'+@Title+'%'

go

跳轉後可以看執行計劃的抓圖...

2011/04/22

新書資訊「為什麼你沒看見大猩猩?」

不曉得去年你有沒有看過一個SAP CRM的廣告,內容要你計算兩隊中白隊傳了幾球?
但其實有個更有趣的測試在裡面,沒看過或想重看?請參考以下連結(該格主還有更棒的解說^^):何以視若無睹 | 家儒的筆記

現在,內容中實驗的作者出書了,詳情請看:為什麼你沒看見大猩猩?

2011/04/21

加上了手機版版面

主要要先開啟Blogger in Draft(就是測試版的意思),就可以在設定中開啟Mobile版型了。詳情可參考"貓箱 - Blogger的Mobile Template"(感謝貓箱^^)

- Posted using BlogPress from my iPhone

2011/04/20

今日一噗

嗯...暫時先用內建功能組合一下,主要先分享我平常在看的東西,慢慢的再來改版面吧(Google Reader 的分享小區塊好醜阿)。