![]() |
Inside Microsoft SQL Server 2005 : T-SQL Programming Itzik Ben-Gan、Dejan Sarka、Roger Wolter/著 Microsoft出版 售價:44.99美元 Amazon四顆半星 |
隨著Microsoft SQL Server版本的演進,T-SQL(Transact Structure Query Language)變得獨立而功能強大,且擁有眾多使用者,是解決各種資料問題的主流語言。由於公司內各種資料日益龐大,MS SQL Server除了功能擴增,而且也廣泛進入企業各系統,這些因素皆讓專門處理資料的T-SQL語言變成顯學。
重新認識T-SQL的時間點到了
SQL語言無法被程序導向語言所取代,而伴隨大量交易、資料整合、商業智慧的結構性需求大增,將令SQL更形重要。
意想不到的解法,猶如智力測驗
書中充滿了結合不同技術的意想不到之解法,讓懂得關鍵之人妙趣橫生,不懂奧妙之人,仍可學習應用。
精通SQL語法,來一場邏輯推理
撰寫SQL語法是邏輯推理的訓練,而T-SQL Querying一書更以18個益智題目作結尾,增加了閱讀的趣味。
部份語法暗藏SQL Server下一版的伏筆
由於時程壓力,為了趕上市而切割SQL Server 2005的部分功能,但因功能尚未完成,導致保留的T-SQL語法高深莫測,這些情況在書中章節裡終於有了解釋。重新認識T-SQL的時間點到了
在關聯式資料庫中,以集合(Set)的方式來處理大量記錄才有效率,使得SQL語言無法被程序導向語言如:C#、Java、Visual Basic等取代。而善用資料是資訊系統成功的關鍵因素之一,伴隨大量交易、資料整合、商業智慧的結構性需求大增,將令SQL更形重要。
雖然討論T-SQL的書很多,但因為SQL Server 2005巨幅擴增了功能,且統一了許多語法的標準,將原來需要透過系統預存程序、DBCC命令才能建置、設定或維護的功能,都回歸到標準的T-SQL語法,並放寬了語法的自由度,例如:建立系統登入與資料庫使用者、透過T-SQL維護索引、TOP運算子可以搭配變數或子查詢,以及搭配CTE(Common Table Expression)語法使用在UPDATE和DELETE語法中、彙總運算搭配OVER運算子等。上述諸多功能在SQL Server 2000是無法以T-SQL 辦到的。
全面性地重新認識T-SQL是必要的,而在這個時間點,夠份量的T-SQL 書籍大概非《Inside Microsoft SQL Server 2005 : T-SQL Programming》和《Inside Microsoft SQL Server 2005 : T-SQL Querying》二書莫屬。書籍的作者群裡,以資深的講師與顧問 Itzik Ben-Gan為首,包含SQL Server 2005團隊的兩位產品經理,分別負責SQL Server查詢引擎和Service Broker的深入介紹,以及其他擁有多年經驗的顧問與教師們合作撰寫,因此,兩本書中有著技術底層的詳細解說,也有各項功能的最佳應用實作。
作者群們主要以集合資料處理(Set-Based Query)和程序邏輯(Procedural Programming)兩個面向來區分這兩本書。前者重視SQL DML語法的邏輯和效率,後者則強化搭配程序控制(如:IF、WHILE、游標等)所建構的伺服器端物件,如:函數、預存程序、CLR 物件、Service Broker 等。意想不到的解法,猶如智力測驗
筆者一直認為,技術書籍與線上說明不同的地方是提供應用場景與閱讀的趣味,並且將技術與實務串起來。因為線上說明寫得像字典,若將資訊語言的應用比喻為作文,則一般人很難光靠一本字典學會作文。我們需要看文章來模擬筆觸、技法與結構。在學習資訊技術時,自然需要實務場景和程式碼範例。
而這兩本書所提供的T-SQL範例大都簡短有力,兩三行就切中要旨,由範例就可看出作者的功力。對於T-SQL的各面向,作者們提綱挈領深入淺出,不管是凸顯語法結構、運算子、適用性、建立伺服器物件等,都讓有T-SQL底子的人能迅速抓住重點。
使用 T-SQL 有如激盪腦力的智力測驗,同一個問題如果要作到讓人驚艷的解法層出不窮,需要經驗與知識的累積,是技術與藝術的展現。而這兩本書讀來讓人愉悅,有如在讀T-SQL的秘技,作者整合了不同的技術,混在一起使用。例如,以一般的SELECT語法查詢,要將多筆記錄的欄位值組成符號分隔的單一字串時,會採用類似如下的做法:
| DECLARE @c nvarchar (4000) SET @c='' SELECT @c=@c + CustomerID +',' FROM Customers SELECT @c |
在上述範例中,會傳回Customers資料表中,以逗號分隔所有客戶編號的單一字串。但作者在《Inside Microsoft SQL Server 2005 : T-SQL Programming 》一書中,強調此種作法的不確定性,因為微軟並沒有明文保證此種連接字串的方法一定可行。但由於FOR XML子句在2005版本時,多了PATH選項,因此組字串可以換成如下標準的查詢方式:
| SELECT CustomerID + ',' AS [text ()] FROM Customers FOR XML PATH ('') |
書中充滿了此種結合不同技術的意想不到之解法,讓懂得關鍵之人妙趣橫生,不懂奧妙之人,仍可抄襲應用。精通SQL語法,來一場邏輯推理
善用SQL Server的指標之一是能否精通SQL語法。而熟悉SQL Server的關連引擎(Relational Engine)如何評估 SQL 語法、如何建立與最佳化執行計畫是一切的基礎。對此,《T-SQL Querying》一書的第一章解釋了SELECT語法的運作邏輯,第二、三兩章則詳細解釋了執行計畫的產生、如何觀察、以及查詢語法的最佳化。
在隨後的第四到第八章中,介紹了子查詢、Ranking 函數、Join、彙總、Top、Apply、修改資料等項目,個別針對SQL 語法中的特殊功能逐一介紹。作者在說明個別的功能時,並非單調地舉個簡單的例子,說明一下用途和語法就結束了。他們大多會延伸該功能的設計意涵,或以相同目的但提出不同解法做個比較,讓你明瞭該項功能的優點。例如:在介紹 Ranking 系列函數Row_Number時,就比較了欲取回查詢結果每筆記錄的循序編號技巧:可用自動編號(Identity)、游標(Cursor)、子查詢以及系統函數 Row_number 等,除了 Row_number 本身的功能外,其間的效率差異才是重點。
最後一章廣泛地介紹如何用T-SQL來處理資料結構,如:Graph、Tree、階層與遞迴等。這讓筆者想起在學校時,用C語言探討資料結構的上課情形,沒想到也可以用SQL語法來介紹這項基本功。書中所舉的資料結構是我們一般常遇到的,例如製造業的BOM(Bill of Materials)表、公司的組織結構與運輸的道路配置等。當你大腦清醒且一杯咖啡在手時,可以玩玩該主題。
最後,主要作者Itzik Ben-Gan 開宗明義便強調:撰寫SQL語法是邏輯推理的訓練,而T-SQL Querying一書更以18個益智題目作結尾,增加了閱讀的趣味。部份語法暗藏SQL Server下一版的伏筆
《Inside Microsoft SQL Server 2005 : T-SQL Programming》一書在前幾章詳細解釋了一般SQL使用上讓人困擾的用法,例如:以文字型態描述日期時間時,最好採用[yy]yymmdd[ hh:mm[:ss][.mmm]]格式,也就是以 ‘20060110’ 來表示時間最佳。前四個章節探討了動態組織與執行SQL語法、暫存資料表和資料表變數、游標等,大家以T-SQL 撰寫商業邏輯時常用的技巧,作者詳加剖析了較佳的用法。
在其後的章節中,本書分別解釋了為何要在伺服器端建置檢視、函數、預存程序、觸發、端點、Service Broker等物件,以及交易管理和錯誤處理。兩書中都解釋了許多關於效能的議題,本書第六章特別強調了使用者函數的正面價值在於:提供了安全、彈性以及程式的可維護性,但它可能損傷效能。而第七章說明了預存程序雖然會因為快取執行計畫而提升效能,但若資料分布不平均,造成索引誤用,依然損傷效能。因此需要小心搭配整個預存程序的WITH RECOMPILE選項,或是SQL Server 2005新提供的:單句查詢語法搭配 OPTION (RECOMPILE) 選項。
讀到Service Broker的產品經理Roger Wolter所撰寫的第十一章時,才能理解由於時程壓力,為了趕上市而切割SQL Server 2005的部分功能。但因功能尚未完成,導致保留的T-SQL語法高深莫測,這些情況在本章終於有了解釋。例如:Service Broker在開啟對話時,總要以BEGIN DIALOG CONVERSATION語法開始,筆者就一直懷疑是否自己的英文能力太差,為何看不出Conversation加Dialog這個關鍵字的用途?原來,Conversation分為Dialog和Monolog兩種,Dialog是兩邊的服務可以互為溝通,Monolog則是發起端單方面的宣告。但Monolog在這個版本還未做出來,而為了下一個版本的相容性,本版就需要保留使用Dialog關鍵字。
另外,在Queue的中繼資料結構中保留了priority欄位,但我卻找不到如何在發送訊息時,設定優先權,結果也是因為開發小組來不及做,僅留了中繼資料的欄位結構。現階段若要分辨訊息的優先順序,只能自行根據不同的優先權個別建立佇列,自己再將訊息派送到正確的佇列,並完成處理。我的另一個疑惑是在建立Service Broker的對話時,來源端的 Service名稱可以直接指定Service物件名稱,但目的端卻需要用字串,讀了此書才知道因為未來目的端可能不侷限於SQL Server所提供的服務,因此以一般的文字串來描述。
《作者簡介》胡百敬
現任職恆逸資訊教育訓練處資深講師,聯經數位、睿智資訊與臺灣微軟技術顧問。著有《SQL Server 2005 SSIS 整合服務》等書,並為專欄作家。
熱門新聞
2025-12-12
2025-12-15
2025-12-12
2025-12-15
2025-12-12
2025-12-15
