SQL Prompt使用教程:避免使用非標準的列別名(ST002和DEP021)
SQL Prompt是一款實用的SQL語法提示工具。SQL Prompt根據(jù)數(shù)據(jù)庫的對象名稱、語法和代碼片段自動進行檢索,為用戶提供合適的代碼選擇。自動腳本設(shè)置使代碼簡單易讀--當開發(fā)者不大熟悉腳本時尤其有用。SQL Prompt安裝即可使用,能大幅提高編碼效率。此外,用戶還可根據(jù)需要進行自定義,使之以預(yù)想的方式工作。
如果使用equals SQL提示符聲明列別名,將會違反樣式規(guī)則(ST002)。最好遵循ANSI-SQL92標準,使用AS關(guān)鍵字分配別名。如果別名不是標準標識符,則用雙引號分隔它。使用單引號一直以來都不被提倡(DEP021)。
曾經(jīng)有一段時間,SQL Server和Sybase中的列別名只是通過賦值表達式來聲明的,而有些人仍然喜歡用舊的方法來聲明,就像我們中的一些人仍然喜歡跳線舞,或者穿緊身衣唱歌。如今,其他關(guān)系數(shù)據(jù)庫系統(tǒng),如PostgreSQL、MySQL、SQLite和Oracle,都使用as語法作為別名,就像ANSI-SQL92標準中定義的那樣,該標準用于為結(jié)果的列分配名稱。
無論古老的語法對您有多方便,通常最好還是堅持這種官方語法。首先,很可能將來有人將不得不維護您的代碼,并且可能會因為沒有學(xué)習過這些代碼而對這些非標準的語法感到不解。其次,微軟可以很容易地決定在SQL Server中支持舊的Sybase語法不再方便,您的代碼也不會傳輸?shù)叫掳姹尽?/span>
列別名侵犯
看在以前的份上,有很多SQL Server可以容忍的方法。下面的一些示例使用舊樣式,即使用equals聲明列別名,這會導(dǎo)致SQL Prompt引發(fā)與樣式規(guī)則(ST002)的沖突,而其他示例則使用字符串文本(“Tables”)作為列別名,這早就被棄用了,因此違反了SQL Prompt不推薦使用的語法規(guī)則之一(DEP021)。
SELECT Tables = Schema_Name(schema_id)+'.'+[name] FROM sys.tables SELECT "Tables" = Schema_Name(schema_id)+'.'+[name] FROM sys.tables SELECT [Tables] = Schema_Name(schema_id)+'.'+[name] FROM sys.tables SELECT 'Tables' = Schema_Name(schema_id)+'.'+[name] FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] [Tables] FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] 'Tables' FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] "Tables" FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] Tables FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] AS [Tables] FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] AS 'Tables' FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] AS "Tables" FROM sys.tables SELECT Schema_Name(schema_id)+'.'+[name] AS Tables FROM sys.tables
所有這些都給出了相同的結(jié)果。
別名的正確方法
但是,在這12種變體中,只有兩種選擇語句遵循官方的ANSI語法,即使用AS關(guān)鍵字,并在必要時將標識符放在雙引號中。在SQL Server 2016中,' string_alias ' = expression的使用被標記為不推薦使用,但這確實適用于任何單引號的使用。
我認為最安全的方法是使用ANSI語法。如果文字不符合SQL Server標識符的規(guī)則,或者是保留字,那么它應(yīng)該使用雙引號,而不是單引號字符串分隔符。SQL Server首選的方括號分隔別名的用法來自Sybase。
我意識到AS關(guān)鍵字是可選的,但是使用可選的ANSI關(guān)鍵字是一個好習慣,如果它能使代碼更易于閱讀和理解,盡管可能會過度使用。我們所有人都不喜歡使用 NATIONAL CHARACTER VARYING( n ),而不是NVARCHAR(n)。
所以,我認為最好的形式是……
SELECT Schema_Name(schema_id)+'.'+[name] AS Tables FROM sys.tables
…或…
SELECT Schema_Name(schema_id)+'.'+[name] AS "My Tables" FROM sys.tables
除非您特別喜歡使用老式的賦值語法,否則應(yīng)該避免使用它,因為它不是標準的SQL,而且只能容納為以前版本的SQL Server編寫的遺留代碼。