作者簡介
Itzik Ben-Gan是Solid Quality Learning的導師和創始人。從1999年開始,他一直是Microsoft SQL Server MVP(最有價值專家),並在全世界已經開展過無數次T-SQL查詢、T-SQL最佳化和編程方面的培訓。
從1992年開始,Itzik就一直致力於涉及各種資料庫和計算機系統相關技術的多個課題。 Itzik擅長T-SQL查詢、查詢最佳化、編程和內部原理,此外他還精通其他的資料庫領域。1999年,Itzik創立以色列SQL Server 和OLAP 用戶組,一直管理至今。
Dejan Sarka——MCP(Microsoft Certified Professional)、MCDBA(Microsoft Certified Database Administrator)、MCT(Microsoft Certified Trainer)、SQL Server MVP、Solid Quality Learning導師, 除了提供專業的培訓,他還一直研究在線上事務處理(OLTP)、OLAP和數據挖掘課題,特別是在設計階段。他經常在一些最重要的國際會議上演講,如TechEd、PASS 和 MCT。對於微軟在中東歐地區最重要的會議NT會議,他是必不可少的。他還是斯洛維尼亞SQL Server用戶組的創始人,並為Solid Quality Learning開發了兩套課程:Data Modeling Essentials和Data Mining with SQL Server 2005。
Roger Wolter,在計算機行業有近30年的經驗,最近7年效力於微軟。他現在是SQL Server團隊的Program Manager,專攻SQL Server Service Broker 和 SQL Server Express。他在微軟參與過的項目包括:COM+、SQLXML、Soap Toolkit、SQL Server Service Broker和SQL Express。
媒體推薦
在關係資料庫中,以集合(set)的方式來處理大量記錄才有效率,使得 SQL(Structure Query Language)語言無法被C#/Java/Visual Basic 等面向對象語言取代。而善用數據是信息系統成功的關鍵因素之一,現今大量交易、數據整合、商業智慧型的結構性需求大增,將使SQL顯得更加重要。
隨著 Microsoft SQL Server 版本的演進,衍生自 ANSI SQL 的 T-SQL(Transact Structure Query Language)語言變得獨立且功能強大,擁有眾多用戶,是解決各種數據問題的主流語言。在 SQL Server 的功能大量擴增並廣泛進入企業各系統後,日益龐大的數據量讓 T-SQL 發揮了重要的作用。
雖然討論 T-SQL 的書很多,但因為 SQL Server 2005 巨幅擴增了功能,且標準化了許多語法,將原來需要通過系統存儲過程、DBCC 才能創建、設定或維護的功能,都回歸到標準的 T-SQL 語法,並放寬了語法的自由度。例如:引入 .NET 對象作為 SQL Server 伺服器端對象、XML 數據類型與 XQuery 語法、Service Broker 訊息佇列服務、以 DDL 建立系統登錄與資料庫用戶、通過 T-SQL 維護索引、TOP 運算符可以搭配變數或子查詢,以及搭配 CTE 使用在 UPDATE、DELETE 語法中、聚合運算搭配 OVER 運算符等,諸多功能在 SQL Server 2000中是無法用T-SQL辦到的。因此,以往的 T-SQL 書籍將不足以講解2005版SQL Server 的功能。
若論微軟 SQL Server方面的最重要著作,大概非 Inside Microsoft SQL Server 系列叢書莫屬了。從SQL Server 6.5 以來,一直常駐在專業 SQL Server DBA 案頭的,就是對應各版本的Inside Microsoft SQL Server系列叢書了。這不是筆者的妄加讚譽,而是素有信息界諾貝爾獎稱呼的圖靈獎(Turing Award)得主 Jim Gray 在該系列書籍的序言中所說的。筆者本身也以讀過該系列的書,代表進入了該版本的世界(例如要熟悉 SQL Server 2000,先讀Inside Microsoft SQL Server 2000),以此為深入了解 SQL Server 的標準。
由於大幅改版與新增功能,導致以往出書速度還蠻快的 Inside Microsoft SQL Server 系列,這次讓大家從 SQL Server 2005 上市後等了一年。也由於功能繁多,原本已極為厚重的 Inside Microsoft SQL Server 再也無法以單行本面世,而改為四本合集的系列叢書。先前 Inside SQL Server 各版本的作者 Kalen Delaney,在此次 Inside Microsoft SQL Server 2005 的四本書中,改任叢書編輯(Series Editor),並親自撰寫《Inside Microsoft SQL Server 2005 : The Storage Engine》一書。
此刻,我們需要全面地重新認識 T-SQL,夠分量的書籍大概非《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 數據表中以逗號分隔所有客戶編號的單一字元串。但作者在本書中,強調此種方法的不確定性,因為微軟並沒有明文保證此種連線字元串的方法一定可行。但由於 FOR XML 子句在 2005 版本時多了 PATH 選項,因此該組字元串可以換成如下標準的查詢方式。
SELECT CustomerID + ',' AS [text()]
FROM Customers FOR XML PATH('')
書中充滿了此種結合不同技術的意想不到之解法,讓懂得關鍵之人頓感妙趣橫生,不懂奧妙之人,仍可借鑑引用。
本書的目的是為了幫助你熟悉 T-SQL 語言,並通過該語言撰寫 SQL Server 伺服器端的對象,例如視圖、用戶自定義函式、存儲過程、觸發器等,由於未解釋 T-SQL 基礎語法定義,屬於進階的書籍。其內各章節大都彼此獨立,且作者所擬的章節針對性很強,你可以瀏覽後,選擇主題切入。日後在工作上需要套用到該項功能時,再回頭精研作者所闡述的要旨。
前4章詳細解釋了T-SQL一般使用中讓人困擾的用法,例如以字元類型描述日期時間時,最好採用 [yy]yymmdd[ hh:mm[:ss][.mmm]] 格式,例如以‘20060423 20:14:42.132’來表示時間最佳。另外還探討了動態組織與執行 SQL 語法、臨時表(Temporary Table)和表變數(Table Variable)的迷思、游標(Cursor)的正確使用方式等,針對以 T-SQL 撰寫商業邏輯時常用的技巧,作者詳加剖析了較佳的用法。
在其後的章節中,分別解釋了為何要在伺服器端創建視圖、函式、存儲過程、觸發器、端點、Service Broker 等對象,以及事務管理和錯誤處理。書中解釋了許多關於性能的議題,如第6章特彆強調了用戶自定義函式的正面價值在於:提供了安全、彈性以及程式的可維護性外,但它可能損傷性能。而第7章說明了存儲過程雖然會因為快取執行計畫而提升性能,但若數據分布不平均,造成索引誤用,依然損傷性能。因此需要小心搭配整個存儲過程的 WITH RECOMPILE 選項,或是 SQL Server 2005 新提供的:單句查詢語法搭配 OPTION(RECOMPILE)選項。
讀到 Service Broker 的產品經理 Roger Wolter 所撰寫的第11章時,才能理解由於時間的壓力,為了趕上市而分割 SQL Server 2005 的部分功能。但因功能尚未完成,導致保留的 T-SQL 語法讓人莫測高深,這些情況在本章有了解釋。例如 Service Broker 在打開對話時,總要以BEGIN DIALOG CONVERSATION 語法開始,筆者就一直懷疑是否自己的英文能力太差,為何看不出Conversation 加 Dialog 這個關鍵字的用途?原來 Conversation 分為 Dialog 和 Monolog 兩種,Dialog 是兩邊的服務可以互為通信,Monolog 則是發起端單方面的聲明。但 Monolog 在這個版本還未做出來,而為了下一個版本的兼容性,本版就需要保留使用 Dialog 關鍵字。另外,在建立 Service Broker 的對話時,來源端的 Service 名稱可以直接指定 Service 對象名稱,但目的端卻需要用字元串格式,讀了此書才知道因為未來目的端可能不局限是 SQL Server 所提供的服務,因此以一般的文字字元串來描述。
本書的譯者趙立東老師有6年的開發經驗,精通 .NET 和 SQL Server。趙老師翻譯本書非常認真,不僅更正了原書提出的勘誤,且在翻譯過程中,經常與原作者Itzik討論和並向他請教,同時也不時和筆者交換意見。所以,在他翻譯的過程中,我受益不少。譯者與博文視點曾合作翻譯了《Programming ASP .NET中文版第3版》一書。此外,他也正在和其他譯者一起翻譯《Inside Microsoft SQL Server 2005:T-SQL Querying》一書,並擔任該書的審校工作,這本書是筆者期待的另一本佳作。
胡百敬
2007年5月於台灣
編輯推薦
本書是Inside Microsoft SQL Server 2005系列四本著作中的一本。它詳細介紹了T-SQL的內部構造,包含了非常全面的編程參考。它提供了使用Transact-SQL (T-SQL)的專家級指導,T-SQL是用於SQL Server的最常見的也是功能最強大的程式語言。該書由Itzik Ben-Gan權威執筆,重點關注語言特性以及它們如何被SQL Server引擎解釋和處理。
通過本書,你將深入了解T-SQL的高級用法,包括觸發器、用戶自定義函式、異常處理等。該書解釋並比較了SQL Server 2000和SQL Server 2005在資料庫開發相關問題上的解決方案,深入討論了SQL Server 2005中新增的T-SQL編程特性,包含了大量的代碼示例、表示例和邏輯難題以幫助資料庫開發人員和管理員理解複雜的邏輯並掌握T-SQL。
本書適合於專業資料庫開發者、BI開發者、DBA和以SQL Server作為後台資料庫的一般應用程式開發者,讀者可以通過書中的最佳實踐、高級技巧和代碼示例來掌握這門複雜的程式語言,以切合實際的方案來解決複雜的實際問題。
目錄
序 I
前言 III
致謝 VII
引言 XI
第1章 數據類型相關的問題,XML和CLR UDT
1.1 DATETIME數據類型
DATETIME的存儲格式
時間處理
Datetime相關的查詢問題
1.2 與字元相關的問題
模式匹配
區分大小寫(Case-Sensitive)的篩選器
1.3 大型對象(Large Object,LOB)
MAX 說明符
BULK行集提供程式
1.4 隱式轉換(Implicit Conversion)
標量表達式
篩選表達式
1.5 基於CLR的用戶定義類型
UDT理論簡介
開發UDT
1.6 XML數據類型
關係資料庫中的XML支持
什麼時候應該使用XML代替關係表現形式?
資料庫中的XML序列化對象
使用開放架構(Open Schema)的XML
作為存儲過程參數的XML數據類型
Xquery修改語句
1.7 結論
第2章 臨時表和表變數
2.1 臨時表
局部臨時表
全局臨時表
2.2 表變數
限制條件
tempdb
範圍和可見性
事務上下文
統計信息
2.3 tempdb相關的注意事項
2.4 表表達式
2.5 比較臨時對象
2.6 綜合練習——關係分區(Relational Division)
2.7 結論
第3章 游標
3.1 使用游標
3.2 游標開銷
3.3 單獨處理每一行
3.4 按順序訪問
自定義聚合
連續聚合
最大並發會話
匹配問題
3.5 結論
第4章 動態SQL
4.1 EXEC
一個簡單的EXEC示例
EXEC不提供接口
串聯變數
EXEC AT
4.2 sp_executesql
sp_executesql接口
語句限制
4.3 環境設定
4.4 使用動態SQL
動態的維護操作
存儲計算
動態篩選器
動態PIVOT/UNPIVOT
4.5 SQL注入
SQL注入:在客戶端動態構建代碼
SQL注入:在伺服器端動態構建代碼
防止SQL注入
4.6 結論
第5章 視圖
5.1 什麼是視圖?
5.2 視圖中的ORDER BY
5.3 刷新視圖
5.4 模組化方法
5.5 更新視圖
5.6 視圖選項
ENCRYPTION
SCHEMABINDING
CHECK OPTION
VIEW_METADATA
5.7 索引視圖(Indexed View)
5.8 結論
第6章 用戶定義函式
6.1 關於UDF
6.2 標量UDF
T-SQL 標量UDF
性能問題
在約束中使用UDF
CLR 標量 UDF
SQL簽名(SQL Signature)
6.3 表值UDF
內聯表值UDF
拆分數組(Split Array)
多語句表值UDF
6.4 逐行調用UDF
6.5 結論
第7章 存儲過程
7.1 存儲過程的種類
用戶定義存儲過程
特殊存儲過程
系統存儲過程
其他類型的存儲過程
7.2 存儲過程接口
輸入參數
輸出參數
7.3 解析
7.4 編譯、重新編譯和重用執行計畫
重用執行計畫
重新編譯
參數嗅探問題
7.5 Execute As
7.6 參數化排序
7.7 動態Pivot
7.8 CLR存儲過程
7.9 結論
第8章觸發器
8.1 AFTER觸發器
inserted 和deleted 表
取得受影響的行數
識別觸發器的類型
對特殊語句不引發觸發器
嵌套和遞歸
UPDATE 和COLUMNS_UPDATED
審核示例
8.2 INSTEAD OF觸發器
逐行觸發器
套用於視圖
自動處理序列
8.3 DDL觸發器
資料庫級觸發器
伺服器級觸發器
8.4 CLR觸發器
8.5 結論
第9章事務
9.1 什麼是事務?
9.2 鎖
9.3 隔離級別
未提交讀
已提交讀
可重複讀
可串列讀
新的隔離級別
9.4 保存點
9.5 死鎖
簡單的死鎖
因缺少索引導致的死鎖
單個表的死鎖
9.6 結論
第10章錯誤處理
10.1 SQL Server 2005之前版本的錯誤處理
10.2 SQL Server 2005中的錯誤處理
TRY/CATCH
事務中的錯誤
死鎖和更新衝突
10.3 結論
第11章Service Broker
11.1 會話對話
會話
約定(Contract)
DEFAULT
佇列(Queue)
服務(Services)
發起和結束對話
會話端點(Conversation Endpoint)
會話組(Conversation Group)
傳送和接收
11.3 簡單的對話
有害訊息(Poison Message)
11.4 對話安全
非對稱密鑰認證
配置對話安全
11.5 路由和分發
相鄰Broker協定(Adjacent Broker Protocol)
路由(Route)
11.6 場景
可靠的SOA
異步處理
11.7 哪裡適合使用Service Broker
Service Broker是什麼
Service Broker不是什麼
Service Broker和MSMQ
Service Broker和BizTalk
Service Broker和Windows Communication Foundation
11.8 結論
附錄A CLR程式指南
A.1 創建CLR Utilities資料庫: SQL Server
A.2 部署:Visual Studio
A.3 部署和測試:Visual Studio 和SQL Server
索引
中英文術語對照表
關於作者