SQL資料備忘 T SQL 編碼標準

2022-03-28 13:13:13 字數 2861 閱讀 8839

1.t-sql 編碼標準

►乙個巢狀**塊中的語句使用四個空格的縮排。(上述**中的多行 select 語句是乙個 sql 語句。)在同一語句中開始新行時,使 sql 關鍵字右對齊。將**編輯器配置為使用空格,而不是使用製表符。這樣,不管使用何種程式檢視**,格式都是一致的。

►大寫所有的 t-sql 關鍵字,包括 t-sql 函式。變數名稱及游標名稱使用混和大小寫。資料型別使用小寫。

►表名別名要簡短,但意義要盡量明確。通常,使用大寫的表名作為別名,使用 as 關鍵字指定表或字段的別名。

►當乙個 t-sql 語句中涉及到多個表時,始終使用表名別名來限定欄位名。這使其他人閱讀起來更清楚,避免了含義模糊的引用。

►當相關數字出現在連續的**行中時(例如一系列 substring 函式呼叫),將它們排成列。這樣容易瀏覽數字列表。

►使用乙個(而不是兩個)空行分隔 t-sql **的邏輯塊,只要需要就可以使用。

►宣告 t-sql 區域性變數(例如 @lngtableid)時,使用適當的資料型別宣告和一致的大寫。

始終指定字元資料型別的長度,並確保允許使用者可能需要的最大字元數,因為超出最大長度的字元會丟失。

始終指定十進位制資料型別的精度和範圍,否則,將預設為未指定精度和整數範圍。

►使用錯誤處理程式,但要記住行首 (bol) 中的錯誤檢查示例不會象介紹的那樣起作用。用來檢查 @@error 系統函式的 t-sql 語句 (if) 實際上在程序中清除了 @@error 值,無法再捕獲除零之外的任何值。(即使示例起作用,它們也只能捕獲最後發生的乙個錯誤,而不是您更想捕獲的第乙個錯誤。)必須使用 set 或 select 立即捕獲錯誤**,如前面示例所示。如果狀態變數仍然為零,應轉換到狀態變數。

►避免使用「未宣告的」功能,例如系統表中未宣告的列、t-sql 語句中未宣告的功能或者未宣告的系統儲存過程或擴充套件的儲存過程。

不要依賴任何隱式的資料型別轉換。例如,不能為數字變數賦予字元值,而假定 t-sql 會進行必要的轉換。相反,在為變數賦值或比較值之前,應使用適當的 convert 函式使資料型別相匹配。另乙個示例:雖然 t-sql 會在進行比較之前對字元表示式進行隱式且自動的 rtrim,但不能依賴此行為,因為相容性級別設定非字元表示式會使情況複雜化。

不要將空的變數值直接與比較運算子(符號)比較。如果變數可能為空,應使用 is null 或 is not null 進行比較,或者使用 isnull 函式。

►不要使用 str 函式進行捨入,此函式只能用於整數。如果需要十進位制值的字串形式,應先使用 convert 函式**至不同的範圍)或 round 函式,然後將其轉換為字串。也可以使用 ceiling 和 floor 函式。

►使用數學公式時要小心,因為 t-sql 可能會將表示式強制理解為乙個不需要的資料型別。如果需要十進位制結果,應在整數常量後加點和零 (.0)。

►決不要依賴 select 語句會按任何特定順序返回行,除非在 order by 子句中指定了順序。

►通常,應將 order by 子句與 select 語句一起使用。可預知的順序(即使不是最方便的)比不可預知的順序強,尤其是在開發或除錯過程中。(部署到生產環境中之前,可能需要刪除 order by 子句。)在返回行的順序無關緊要的情況下,可以忽略 order by 的開銷。

►不要在 t-sql **中使用雙引號。應為字元常量使用單引號。如果沒有必要限定物件名稱,可以使用(非 ansi sql 標準)括號將名稱括起來。

►在 sql server 2000 中,盡量使用表變數來代替臨時表。如果表變數包含大量資料,請注意索引非常有限(只有主鍵索引)。

►先在例程中建立臨時表,最後再顯式刪除臨時表。將 ddl 與 dml 語句混合使用有助於處理額外的重新編譯活動。

►要認識到臨時表並不是不可使用,適當地使用它們可以使某些例程更有效,例如,當需要重複引用大型表或常用表中的某個資料集時。但是,對於一次性事件,最好使用匯出表。

►使用錶值 udf 時要小心,因為在變數(而不是常量)中傳遞某個引數時,如果在 where 子句中使用該引數,會導致表掃瞄。還要避免在乙個查詢中多次使用相同的錶值 udf。但是,錶值 udf 確實具有某些非常方便的動態編譯功能。[

tom moreau

在2003

年11 月份「

生成序列號

」專欄中的「使用

udf

填充表變數」。-

編者按]

►幾乎所有的儲存過程都應在開始時設定 set nocount on,而在結束時設定 set nocount off。[set nocount on

使sql server

無需在執行儲存過程的每個語句後向客戶端傳送

done_in_proc

訊息。-

編者按] 此標準同樣適用於觸發器。

►只要在例程中使用多個資料庫修改語句,包括在乙個迴圈中多次執行乙個語句,就應考慮聲明顯式事務。

►使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題。基於集的方法通常更有效。

►與臨時表一樣,游標並不是不可使用。對小型資料集使用 fast_forward 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的資料時。在結果集中包括「合計」的例程通常要比使用游標執行的速度快。如果開發時間允許,基於游標的方法和基於集的方法都可以嘗試一下,看哪一種方法的效果更好。

►使用包含序號(從 1 到 n)的表很方便。

►理解 cross join 的工作原理並加以利用。例如,您可以在工作資料表和序號表之間有效地使用 cross join,結果集中將包含每個工作資料與序號組合的記錄。

►我的結束語是:t-sql **往往很簡潔,因此如果某個**塊看起來很難處理或重複內容較多,那麼可能存在一種更簡單,更好的方法。

TSQL生成資料匯出SQL

create proc dataexport tablename varchar 100 asbegin declare columnnamelist nvarchar 4000 declare columnvaluelist nvarchar 4000 set columnnamelist set...

sql筆記1 建立資料可 T SQL

use master 設定當前資料庫為master,以便訪問sysdatabases表 go if exists select from sysdatabases where name studb drop database studb go exec xp cmdshell mkdir d pro...

Vertica資料庫sql操作備忘

刪除主鍵 vertica資料庫的主鍵值並不是唯一的 select analyze constraints fb s.c log 找到key名,再 alter table fb s.c log drop constraint c primary select analyze constraints f...