SQL Server 2012大幅增強了T SQL

2021-08-26 21:20:23 字數 2672 閱讀 4371

原文出處

fetch與offset

目前,對於實現服務端分頁,sql server開發人員傾向於選擇使用命令式技術,如將結果集加載入臨時表,對行進行編號,然後從中挑選感興趣的範圍。有一些開發人員選擇使用更加時髦的row_number和over模式。另外,還有一些開發人員堅持使用游標。雖然這些技術都不是太難,但是它們可能會較為耗時並且容易出錯。不僅如此,由於每個開發人員都有自己中意的實現方式,從而造成這些技術並不一致。

sql server 2012通過增加宣告式資料分頁解決了該問題。開發人員可以通過在t-sql的order by子句後加上offset和fetch next選項來完成資料分頁。目前sql server並沒有為其做效能優化,而只是幫助完成使用者需要手工完成的工作。正如greg low博士在演示中所說,只有當使用者知道你試**決的問題是什麼,而不是知道你怎樣去解決問題的時候,他們才可以更好地編寫出查詢優化來對效能進行改善。

over子句視窗

有時候開發人員需要基於行之間的差異來編寫查詢。例如,你可能有興趣想知道處理當前行與上一行之間所花去的時間。使用游標很容易解決該問題,但由於其風格和效能原因,大家並不怎麼使用。你還可以使用子查詢進行逐行執行,但這樣的代價實在太過昂貴。最後,你還可以將問題推給客戶端,但這需要客戶端是一門程式語言而不只是乙個報表工具方能起效。

現在你可以使用lag函式直接訪問上一行。由於使用者顯式宣告了試圖完成的工作,因此查詢分析器會在記憶體中保留上一行,而不再需要建立乙個子查詢,這反過來也極大地提公升了效能。雖然lag預設為上一行,但是如果你需要進一步回溯,可以在其中指定偏移量。

lag與它的姊妹函式lead均為ansi標準的一部分。該特性自從微軟在sql server 2005中部分實現over子句時,就一直被開發人員要求加入。

這一版本還支援了first_value和last_value。

反射 先前開發人員若想要確定查詢或儲存過程的返回結果型別,需要使用set fmtonly命令。使用該命令可以在不需要實際執行查詢的情況下預覽返回結果的列資訊。可惜的是,返回的資訊僅僅侷限於列的定義,而如果只要先前執行查詢便能夠獲得這些資訊。

通過使用新的sp_describe_first_result_set儲存過程,開發人員可以獲得查詢和儲存過程返回結果的詳細資訊。這些資訊包括資料型別及其規模、源表/列,列是否可被更新或由計算而得,以及其他大量資訊。動態管理檢視sys.dm_exec_describe_first_result和sys.dm_exec_describe_first_result_set_for_object同樣具有該特性。

防禦式程式設計(defensive coding)

開發人員在呼叫同事編寫的儲存過程時通常很頭疼,這是因為儲存過程返回結果在編譯期沒***,因此意外的破壞性改動成了一大顧慮。儘管t-sql沒有提供任何手段來預防這些錯誤,但是可以借助result sets選項將錯誤發生率降至最低。

開發人員可以通過指定result sets選項要求儲存過程返回特定的資料結構。如果儲存過程返回的結果集與被要求的有出入,將會發生錯誤並導致批次中止。由於發生的錯誤是執行時錯誤,因此我們建議使用該選項的開發人員建立完整系列的單元測試,以確保**在接觸生成環境前可以觸發該錯誤。

錯誤處理

t-sql從2023年就開始支援try-catch ,但奇怪的是,直到現在才有了throw。throw不帶引數,它的用法與c#和vb中catch塊中的throw類似。也就是說,它會重新丟擲異常,而不會丟失當時捕捉到的任何資訊。它對於向重試佇列記錄或新增條目很有幫助,同時也可以通知應用程式出錯。

當throw帶參使用時,它類似於raiserror,不同之處在於它支援sys.messages之外的錯誤資訊號(error number),並且它的嚴重級別(severity)總是16。還有一點與raiseerror不同的是,所有未**獲的throw錯誤總是批量終止。

解析和轉換

t-sql目前支援parse函式,該函式包含選項用於指定區域性設定(culture)。區域性設定是.net框架支援的諸多特性之一,用於表明解析如何實現,try_parse函式也包含該選項。

類似的,還有乙個新的try_convert函式。這兩者以及tryparse函式在轉換失敗後會返回null。

另一方面,format函式採用了.net格式化設定。儘管與本地函式(如str)相比它的速度稍慢,但是卻更加靈活。

日期/時間函式

雖然t-sql仍然遠沒達到完美,但至少日期/事件函式處理上有了些許改善。eomonth函式用於返回月份的最後一天,這對報表是乙個非常有用的特性。***fromparts系列函式使用一系列引數而不是單個字串來構造日期和時間。它包含了對資料型別date、datetime、datetime2、datetimeoffset、smalldate以及time的支援。

混合函式(misc. function)

t-sql包含了access和visual basic中choose的函式。在某些情況下,它可以被當成乙個簡化版的case使用。另外乙個從這些語言中借鑑的函式是iif。

concat可用於字串拼接。它除了可以讓**更容易地移植到其他資料庫語言中,還提供了與+運算子不一樣的null處理方式。itzikben-gan寫道:

> 連線運算子+在輸入為null時會產生結果null。而concat函式在轉換前將null輸入轉換為空字串。 當然,你可以使用colaesce函式替換null輸入為空字元來完成同樣的工作,不過這樣做**會讓**顯得混亂。

解除安裝sql server 2012

好不容易裝上了sql server2012資料庫,可是卻不能連線本地的資料庫,後來發現缺少一些服務,於是決定重新安裝,但是解除安裝卻很麻煩,如果解除安裝不乾淨的話,重新安裝會出問題,所以下面就總結一些方法 在解除安裝sql server 2012後,大家都希望能夠將登錄檔資訊完全刪乾淨,下面就將教您...

SQLServer 2012 高效分頁

sql code 功能 生成測試資料.create table test paging id int identity 1,1 not null primary key,testnumber int not null,testname varchar 20 not null,testdept var...

SQL Server2012中的Throw語句

簡 介sql server2012實現了 類似c 丟擲異常的 throw 語句。相比較於 sqlserver2005 之前使用 error,和sqlserver2005 之後使用 raiserror 引發 異常都是乙個不小的 進步,下面來看一下 throw 的用法。raiserror 和throw ...