亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

T-SQL編碼標準

系統(tǒng) 3853 0

1.? 概述

1.1. 基本原則
以大小寫敏感編寫SQL語句。

盡量使用Unicode 數(shù)據(jù)類型。

優(yōu)先使用連接代替子查詢或嵌套查詢。

盡量使用參數(shù)化SQL查詢代替語句拼接SQL查詢。

禁止使用[拼音]+[英語]的方式來命名SQL對象或變量。

盡量使用存儲過程代替SQL語句。

1.2. 基本規(guī)范
建議采用Pascal樣式或Camel樣式命名數(shù)據(jù)庫對象。

大寫T-SQL語言的所有關(guān)鍵字,謂詞和系統(tǒng)函數(shù)。

2.? 命名規(guī)范
在一般情況下,采用Pascal樣式或Camel樣式命名數(shù)據(jù)庫對象,使在開發(fā)基于數(shù)據(jù)庫應(yīng)用 程序 的時候通過ORM 工具 生成的數(shù)據(jù)訪問代碼不需要調(diào)整就符合 程序 開發(fā)語言(比如C#)命名規(guī)范。另外,關(guān)系型數(shù)據(jù)庫同Xml結(jié)合得越來越緊密,規(guī)范的命名越來越重要。

在實際數(shù)據(jù)庫開發(fā)過程中,如果需求方已經(jīng)提供數(shù)據(jù)庫設(shè)計方案,建議以提供的方案為準;在原有數(shù)據(jù)庫上進行升級開發(fā)時,在可行的情況下可適當做出設(shè)計調(diào)整以符合 編程 規(guī)范。

1.3. 對象命名
1.3.1.? 數(shù)據(jù)庫
第一種方式,采用Pascal樣式命名,命名格式為[項目英文名稱]。

示例:AdventureWorks

第二種方式,采用Pascal樣式命名,命名格式為[項目英文名稱] + Db。

示例:AdventureWorksDb

? BizTalkRuleEngineDb

建議采用第一種方式。

1.3.2.? 數(shù)據(jù)庫文件
數(shù)據(jù)文件:[數(shù)據(jù)庫名稱] + _Data.mdf

日志文件:[數(shù)據(jù)庫名稱] + _Log.ldf

示例:AdventureWorks_Data.mdf

????? AdventureWorks_Log.ldf

1.3.3.? 關(guān)系型數(shù)據(jù)倉庫
采用Pascal樣式命名,命名格式為[項目英文名稱] + DW。

示例:AdventureWorksDW

1.3.4.? 數(shù)據(jù)架構(gòu)
除SQL Server 系統(tǒng)定義的數(shù)據(jù)架構(gòu)外,新建架構(gòu)采用Pascal樣式命名,命名格式為[架構(gòu)名]。

示例:HumanResources

????? Production

對數(shù)據(jù)庫對象 Table,View,Procedure,F(xiàn)unction等使用數(shù)據(jù)架構(gòu)進行歸類。在SQL Server 2000中dbo為默認架構(gòu)。

1.3.5.? 數(shù)據(jù)表
采用Pascal樣式命名,命名格式為[表名]。

示例:Employee

????? Product

表名以英文單數(shù)命名,主要是參考SQL Server 2005示例數(shù)據(jù)庫,個人理解不采用復(fù)數(shù)是為了更好的使用ORM 工具 生成符合 編程 規(guī)范的代碼(比如C#)。

示例:使用Product

? 而不是Products

1.3.6.? 數(shù)據(jù)視圖
視圖名稱采用Pascal樣式命名,命名格式為v + [視圖名稱]。

示例:vEmployee

????? vSalesPerson

1.3.7.? 數(shù)據(jù)列
列名稱命名采用英文單詞或縮寫,英文單詞只來自于具體業(yè)務(wù)定義,盡量表達清楚含義。采用Pascal樣式命名,命名格式為[列名稱]。

示例:AddressID

????? PostalCode

盡量避免使用拼音命名,如果不可避免,對于比較短的列名,采用拼音全寫,如果拼音列名比較復(fù)雜,可以采用首個字用全拼,其它字用首字母大寫表示。

示例:寧波 Ningbo

? 經(jīng)營方式 JingYFS

1.3.8.? 存儲過程
建議采用Pascal樣式命名,命名格式為[存儲過程名稱]。

示例:GetUser

???? AddUser

備注:在SQL Server 2005示例數(shù)據(jù)庫中使用Camel樣式命名。

1.3.9.? 函數(shù)
自定義函數(shù)采用Pascal樣式命名,命名格式為[函數(shù)名],系統(tǒng)函數(shù)使用全部大寫。

示例:SELECT ISNULL(@LastName,'Unknown last name');

GETDATE()

1.3.10.???? 用戶定義數(shù)據(jù)類型
采用Pascal樣式命名,命名格式為[自定義數(shù)據(jù)類型名稱]。

示例:Flag

????? NameStyle

1.3.11.???? DML觸發(fā)器
DML觸發(fā)器是當數(shù)據(jù)庫服務(wù)器中發(fā)生數(shù)據(jù)操作語言 (DML) 事件時要執(zhí)行的操作。DML 事件包括對表或視圖發(fā)出的 UPDATE、INSERT 或 DELETE 語句。根據(jù)事件不同命名規(guī)則使用前綴進行區(qū)分,格式為 [u|i|d] + [表名|視圖名]

示例:uEmployee

? iEmployee

????? dEmployee

另外一種方式為,

AFTER 觸發(fā)器:TR_表名_[后面插入加I,修改加U,刪除加D]。

INSTEAD OF 觸發(fā)器:TR_表名或視圖名_OF[后面插入加I,修改加U,刪除加D]

1.3.12.???? DDL觸發(fā)器
響應(yīng)各種數(shù)據(jù)定義語言 (DDL) 事件而激發(fā)。這些事件主要與以關(guān)鍵字 CREATE、ALTER 和 DROP 開頭的 Transact-SQL 語句對應(yīng)。執(zhí)行 DDL 式操作的系統(tǒng)存儲過程也可以激發(fā) DDL 觸發(fā)器。

采用Camel樣式命名,命名單詞能夠描述DDL觸發(fā)器功能。

示例:

CREATE TRIGGER safety

ON DATABASE

FOR DROP_TABLE, ALTER_TABLE

AS

?? PRINT 'You must disable Trigger "safety" to drop or alter tables!'

?? ROLLBACK ;

另外一種方式為添加ddl前綴,

示例:

CREATE TRIGGER [ddlDatabaseTriggerLog]

ON DATABASE

FOR DDL_DATABASE_LEVEL_EVENTS

AS

1.3.13.???? 主鍵、外鍵關(guān)系和索引
主鍵: PK_[表名稱]_[主鍵];如果是組合主鍵,使用PK_[表名]_[主鍵1]_[主鍵2]。

示例:PK_Store_CustomerID

? PK_StoreContact_CustomerID_ContactID

外鍵關(guān)系:FK_[從表名稱]_[主表名稱]_[外鍵列名稱]。

示例:FK_StoreContact_Store_CustomerID

聚集索引:PK_[表名稱]_[主鍵];如果是組合主鍵,使用PK_[表名]_[主鍵1]_[主鍵2]。

示例:PK_Store_CustomerID

? PK_StoreContact_CustomerID_ContactID

唯一非聚集索引:AK_[表名稱]_[列名稱]。

示例:AK_Store_rowguid

不唯一非聚集索引:PK_[表名稱]_[列名稱]。

示例:IX_Store_SalesPersonID

主 XML索引:PXML_[表名稱]_[Xml類型列名稱]。

示例:PXML_Store_Demographics

備注:以上命名參考Sql Server 2005示例數(shù)據(jù)庫,一般只需設(shè)計器自動生成,不需要額外修改。

1.4. 參數(shù)命名
1.4.1.? 數(shù)據(jù)列參數(shù)
命名格式為 @ + [列名稱]。

示例:@EmployeeID

在列名不符合Pascal樣式時(早期遺留系統(tǒng)),例如使用全部大寫的列名稱,或使用“_”進行連接的字段名稱,參數(shù)名稱定義使用 @ + [列名稱],這里的列名稱盡量符合Pascal樣式命名。

1.4.2.? 非數(shù)據(jù)列參數(shù)
在參數(shù)無法跟列名稱進行關(guān)聯(lián)時,使用能夠反映該參數(shù)功能的英文單詞或單詞組合, 采用Pascal樣式命名。

示例:@ErrorID

????? @Flag

1.5. 常見命名
1.5.1.? 常用字段命名
這里的常用字段是指在建表時頻繁使用的表名或列名,下表對常用字段進行建議性定義,

列名稱????????? 數(shù)據(jù)類型???????????? 說明

CreatedDate???? datetime??????????????? 紀錄創(chuàng)建日期,一般使用GETDATE()自動生成

ModifiedDate??????? datetime??????????????? 紀錄最后修改日期,首次使用GETDATE()

DeletedDate???? datetime??????????????? 記錄刪除(標記刪除)日期

StartDate?????? datetime??????????????? 開始日期

EndDate???????? datetime??????????????? 結(jié)束日期

StartTime?????? datetime??????????????? 開始時間

EndTime???????? datetime??????????????? 結(jié)束時間

rowguid???????? uniqueidentifier??????? 唯一標識行的ROWGUIDCOL號,用于支持合并復(fù)制

ID????????????? int???????????????? 使用ID代替Id或id。一般為自增長主鍵列

ParentID??????????? int???????????????? 父ID

Status????????? int???????????????? 狀態(tài)

3.? SQL編寫
3.1. 大小寫
大寫T-SQL 語言的所有關(guān)鍵字,謂詞和系統(tǒng)函數(shù)。變量名稱及游標名稱使用Pascal樣式。數(shù)據(jù)類型定義使用全部小寫。

示例:DECLARE @LastName nvarchar(32);

3.2. 使用“;”
使用“;”作為 Transact-SQL 語句終止符。雖然分號不是必需的,但使用它是一種好的習(xí)慣。

示例:

USE AdventureWorks;

GO

DECLARE @find varchar(30);

SET @find = 'Man%';

SELECT LastName, FirstName, Phone

FROM Person.Contact

WHERE LastName LIKE @find;

3.3. 存儲格式
盡量采用Unicode數(shù)據(jù)存儲格式,提高可移植性和兼容性,實際應(yīng)用中盡量使用nchar、nvarchar、ntext代替char、varchar、text。

3.4. 類型選擇
如果字符具有明確的長度,使用nchar代替nvarchar;char代替varchar。

在只有兩個可能數(shù)值時,使用bit代替int或smallint。

在SQL Server 2005中,使用nvarchar(MAX)代替ntext;varchar(MAX)代替text;varbinary(MAX)代替image。

在特殊的數(shù)據(jù)表結(jié)構(gòu)中可考慮xml數(shù)據(jù)類型,達到事半工倍的效果。

3.5. 默認值
在建立數(shù)據(jù)表時,盡量使用默認值代替NULL值。比如設(shè)置CreatedDate列默認值為GETDATE()。在可行的情況下設(shè)置字段為不允許空。

3.6. 字段長度
始終指定字符數(shù)據(jù)類型的長度,并確保允許用戶可能需要的最大字符數(shù),避免超出最大長度時出現(xiàn)字符丟失現(xiàn)象。對于字符型數(shù)據(jù),建議采用2的n次方來定義數(shù)據(jù)長度。

示例:nvarchar(32)

? varchar(64)

3.7. 使用“'”
在 T-SQL 代碼中為字符常量使用單引號,避免使用雙引號。

3.8. 語句縮進
一個嵌套代碼塊中的語句使用四個空格的縮進。使用Microsoft SQL Server Management Studio ,選擇“ 工具 ”菜單,打開“選項”菜單,在選項對話框中選擇文本編輯器->純文本->制表符,選中“插入空格單選框”,設(shè)置“制表符大小”為4,縮進大小為“4”。

3.9. 語句換行
建議SQL代碼每行以關(guān)鍵字或“'”開頭。

示例:

SELECT [ShiftID]

????? ,[Name]

????? ,[StartTime]

????? ,[EndTime]

????? ,[ModifiedDate]

? FROM [AdventureWorks].[HumanResources].[Shift]

3.10.?? 語句分割
使用一個(而不是兩個)空行分隔 T-SQL 代碼的邏輯塊。

3.11.?? 使用“*”
盡量避免在任何代碼中使用 “SELECT *”。

3.12.?? 表名別名
表名別名要簡短,但意義要盡量明確。通常使用大寫的表名作為別名,使用 AS 關(guān)鍵字指定表或字段的別名。

3.13.?? 類型轉(zhuǎn)換
不要依賴任何隱式的數(shù)據(jù)類型轉(zhuǎn)換,不要假定 T-SQL 會進行必要的轉(zhuǎn)換。例如,把數(shù)字變量賦予字符值。相反,在為變量賦值或比較值之前,應(yīng)使用適當?shù)?CONVERT 函數(shù)使數(shù)據(jù)類型相匹配。

3.14.?? 數(shù)值比較
不要將空的變量值直接與比較運算符(符號)比較。如果變量可能為空,應(yīng)使用 IS NULL 或 IS NOT NULL 進行比較,或者使用 ISNULL 函數(shù)。

3.15.?? 排序
決不要依賴 SELECT 語句會按任何特定順序返回行,除非在 ORDER BY 子句中指定了順序。通常,應(yīng)將 ORDER BY 子句與 SELECT 語句一起使用。可預(yù)知的順序(即使不是最方便的)比不可預(yù)知的順序強,尤其是在開發(fā)或調(diào)試過程中。在返回行的順序無關(guān)緊要的情況下,可以忽略 ORDER BY ,減少資源開銷。

3.16.?? Unicode字符串
在Unicode字符前面使用N前綴,避免引起數(shù)據(jù)的不一致。

示例:

-- Assumes the default code page is not Greek

CREATE TABLE #t1 (c1 nchar(1))

INSERT #t1 VALUES(N'Ω')

INSERT #t1 VALUES('Ω')

SELECT * FROM #t1

輸出結(jié)果:

c1??

----

Ω

O

3.17.?? BEGIN...END 塊
在SQL代碼快中盡量使用BEGIN...END 語句塊,提高代碼可閱讀性。

3.18.?? TRY塊
在SQL Server 2005中對一些可能執(zhí)行失敗的語句盡量使用TRY塊。Transact-SQL 語句組可以包含在 TRY 塊中,如果 TRY 塊內(nèi)部發(fā)生錯誤,則會將控制傳遞給 CATCH 塊中包含的另一個語句組。

示例:

BEGIN TRY

??? SQL 語句組1

END TRY

BEGIN CATCH

??? SQL 語句組2

END CATCH;

3.19.?? TOP子句
在SQL Server 2005中加強了TOP的使用,盡量使用TOP(變量)來減少SQL拼串現(xiàn)象。

3.20.?? TRANSACTION編寫
只要在例程中使用多個數(shù)據(jù)庫修改語句,包括在一個循環(huán)中多次執(zhí)行一個語句,就應(yīng)考慮聲明顯式事務(wù)。在SQL SERVER 2005 中,增加了TRY塊可進行很好的應(yīng)用。

實例:

??? BEGIN TRY

??????? BEGIN TRANSACTION;

??????? UPDATE [HumanResources].[Employee]

??????? SET [Title] = @Title

??????????? ,[HireDate] = @HireDate

??????????? ,[CurrentFlag] = @CurrentFlag

??????? WHERE [EmployeeID] = @EmployeeID;

??????? INSERT INTO [HumanResources].[EmployeePayHistory]

??????????? ([EmployeeID]

??????????? ,[RateChangeDate]

??????????? ,[Rate]

??????????? ,[PayFrequency])

??????? VALUES (@EmployeeID, @RateChangeDate, @Rate, @PayFrequency);

??????? COMMIT TRANSACTION;

??? END TRY

??? BEGIN CATCH

??????? -- Rollback any active or uncommittable transactions before

??????? -- inserting information in the ErrorLog

??????? IF @@TRANCOUNT > 0

??????? BEGIN

??????????? ROLLBACK TRANSACTION;

??????? END

??????? EXECUTE [dbo].[uspLogError];

??? END CATCH;

3.21.?? 存儲過程
在編寫存儲過程時,使用PROCEDURE 代替 PROC 簡寫。

示例:CREATE PROCEDURE [dbo].[存儲過程名字]

4.? 代碼注釋
4.1. 代碼頭部注釋
在SQL代碼塊(sql文件或存儲過程)的頭部進行注釋,標注創(chuàng)建人(Author)、創(chuàng)始日期(Create date)、修改信息(Modify [n])。

格式:

-- =============================================

-- Author:????? <Author,,Name>

-- Create date: <Create Date,,>

-- Description: <Description,,>

-- Modify [n]:? < Modifier,Date, Description >

-- =============================================

示例:

-- ================================================

-- Author:????? Zhanghaifeng

-- Create date: 2006-12-25

-- Description: H2000報關(guān)單回執(zhí)處理

-- Modify [1]:? 鄭佐, 2006-12-31, 簡化邏輯判斷流程

-- Modify [2]:? 鄭佐, 2007-01-20, 更新條件判斷

-- ================================================

注:日期格式使用 yyyy-MM-dd。Modify [n] n代表修改序號,從1開始,每次修改加1。

4.2. TRANSACTION注釋
建議在每個事務(wù)的開頭進行注釋,說明該事務(wù)的功能。

-- < Modifier,Date, Description >

BEGIN TRANSACTION;

5.? 附錄A 命名規(guī)則
常見命名規(guī)則有四種樣式:完全大寫、完全小寫、Pascal 大小寫和 Camel 大小寫。

5.1. Pascal 大小寫
組成標識符的每個單詞的首字母大寫,其余字母小寫的書寫約定。對于縮寫的雙字母單詞,要求全部大寫。

例如:ApplicationException

????? ID

5.2. Camel 大小寫
標識符的首字母小寫,每個后面連接的單詞的首字母大寫,其余字母小寫的書寫約定。對于縮寫的雙字母單詞,要求它們出現(xiàn)在標識符首部時全部小寫,否則全部大寫。

例如:applicationException

????? id

5.3. 匈牙利命名法
匈牙利命名法由匈牙利 程序 員發(fā)明,他在微軟工作了多年,此命名法就是通過微軟的各種產(chǎn)品和 文檔 傳出來。多數(shù)有經(jīng)驗的 程序 員,不管他們用的是哪門語言,都或多或少在使用它。

基本原則:變量名 = 屬性 + 類型 + 對象描述

即一個變量名是由三部分信息組成,這樣, 程序 員很容易理解變量的類型、用途,而且便于記憶。

6.? 附錄B 參考資源
6.1. Microsoft SQL Server 2005 聯(lián)機叢書
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=BE6A2C5D-00DF-4220-B133-29C1E0B6585F

6.2. SQL Server 2005示例數(shù)據(jù)庫
AdventureWorks

AdventureWorksDW

6.3. 編寫可移植的 Transact-SQL 代碼
http://www.microsoft.com/china/msdn/library/data/sqlserver/USsqldnsqldevdev_06112004L.mspx

6.4. T-SQL 編碼標準
http://www.microsoft.com/china/msdn/library/data/sqlserver/sp04l9.mspx

T-SQL編碼標準


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲美女激情 | 亚洲婷婷在线视频 | 亚洲成人一区二区 | 另类图片综合网 | 四虎成年永久免费网站 | 国产一级特黄a大片免费 | 国产精品欧美亚洲区 | 欧美毛片又粗又长又大 | 久久国产精品无码网站 | 国内国语一级毛片在线视频 | 亚洲国产女人aaa毛片在线 | 吃奶japanesevideo 处videossex第一次中 | 九九免费精品视频在这里 | 天天操夜夜草 | 爱爱爱久久久久久久 | 亚洲国产欧美在线观看 | 亚洲精品久久久久久婷婷 | 亚洲精品国自产拍影院 | 久久中文字幕免费视频 | 欧美一区二区三区婷婷月色 | 日韩dv| 中文字幕一区二区三区精彩视频 | 国产成人精品在线观看 | 国产一级黄色录像 | 四虎地址8848 | 午夜深夜福利网址 | 亚洲国产欧洲 | 精品亚洲一区二区 | 久久97久久97精品免视看清纯 | 亚洲综合在线另类色区奇米 | 不卡网| 久久亚洲精品中文字幕 | 97国产在线视频公开免费 | 亚洲视频免费在线观看 | 久久精品国产400部免费看 | 欧美成人私人视频88在线观看 | 高清一级毛片 | 国产成人午夜性视频影院 | 奇米第四色7777 | 中国一级特黄真人毛片免 | 国内第一永久免费福利视频 |