您好,登錄后才能下訂單哦!
SQL Prompt根據數據庫的對象名稱、語法和代碼片段自動進行檢索,為用戶提供合適的代碼選擇。自動腳本設置使代碼簡單易讀--當開發者不大熟悉腳本時尤其有用。SQL Prompt安裝即可使用,能大幅提高編碼效率。此外,用戶還可根據需要進行自定義,使之以預想的方式工作。
本文探索了表別名的作用,解釋了何時需要表別名,并且說明了它們的一般用途,對別名的合理命名的必要性,以及SQL Prompt如何處理它們。
表別名的主要目的(除了需要使用別名的情況之外)是使SQL查詢更易于閱讀和理解。不,這不是我輸入的錯誤。別名并沒有使鍵入SQL查詢變得更加容易和快捷。如果您使用的是SQL Prompt,則尤其如此,因為它會為您完成所有鍵入操作。
如果啟用其“分配別名”選項,則在您輸入SQL語句時,SQL Prompt會自動建議一個或兩個字符的別名,只是因為它必須提供某些內容但不能提供含義。這樣做不是因為簡短的無意義的名稱更好。這僅意味著數據庫開發人員應改進默認別名以提供含義。
在哪里可以使用表別名?
在標準SQL中,僅在SELECT語句中使用別名。 可以說,您只能在具有FROM子句的語句中使用它們,因為SQL Server的語法允許它在UPDATE和DELETE語句中使用FROM子句。 使用表別名時,您只是為表引用的實例提供了特定的名稱,而不是實際的表。只有該引用才是別名。
我是否總是需要限定列名?
在SQL中,如果列名本身是模棱兩可的,則只需要使用對表源的引用來限定列名,因為列名本身可能來自FROM子句中的一個或多個表源。在SQL Server中,使用合格的列名無論如何都會使解析器更輕松,并使查詢更易于閱讀。
但是,如果沒有JOIN子句,則在列名中添加任何種類的表限定符(無論是否帶別名)都是完全多余的,不應使用。
我是否總是需要使用表別名?
要使一列符合其表的資格,通常不必使用表別名(在ANSI SQL中也稱為關聯名)。您可以只使用提供該列的表源的名稱。
僅當引用不具有名稱的表源(例如派生表或行集函數)或使用命名表源(例如表,視圖或表-)時,才必須使用別名值函數,在同一查詢中不止一次。一般而言,如果表源已經有了合適的名稱,那么為什么要提供另一個名稱呢?通常,您這樣做只是為了使查詢的意圖更加清晰。如果沒有,那么它就會成為障礙。
什么時候需要別名?
需要使用別名的原因之一是基表的名稱中包含非法字符。您可能看起來很生氣,說您永遠不會屈服于此,但是另一方面,在表名限定符的開頭使用“@”是不合法的,因此表變量是一個問題。例如,如果不為表變量提供別名,則必須提供方括號定界符以通過其全名引用它。當然,如果表中確實包含非法字符,則表別名可以使您免于討厭的方括號。
您還必須使用表別名來限定一列,而不是依賴于表名(如果該表位于在JOIN中被兩次使用的表中)。 例如:
SELECT?Object_Schema_Name(TablesEtc.object_id)?+?'.'?+?TablesEtc.name?AS?TableName, ????Constraints.name?+?'?('?+?RTrim(Constraints.type) ??????+?')'?COLLATE?DATABASE_DEFAULT?AS?[Constraint] ??FROM?sys.objects?AS?TablesEtc ????INNER?JOIN?sys.objects?AS?Constraints ??????ON?Constraints.parent_object_id?=?TablesEtc.object_id ?????WHERE?TablesEtc.is_ms_shipped=0 ?????ORDER?BY?TableName
sys.objects與sys.objects結合在一起,因此如果不使用別名就無法正常工作。 通過為他們選擇有意義的名稱,我們還可以避免錯誤。
如果要加入表源(例如查詢),則需要提供一個名稱。不存在默認名稱。在這里,我們將從多行值創建兩個表源,然后將它們聯接。
SELECT?numbers.number,?Coalesce(Names.NameForFrequency,'frequently')?AS?HowManyTimes?? FROM? ????(VALUES(0),(1),(2),(3),(4),(5))?AS?numbers(number) ?LEFT?OUTER?join ????(VALUES(0,'never'),(1,'once'),(2,'twice'),(3,'thrice'))?AS?Names(number,NameForFrequency) ON?numbers.number=Names.number
在第一個示例中,我們使用了AS關鍵字來表明我們正在引入別名。它是可選的,因此您可以省略它,但這是一個不好的做法,因為它會使您的意圖變得不太清楚。
SQL Prompt如何處理別名
啟用了“分配別名”選項(“SQL Prompt”>“選項”>“插入的代碼”>“別名”)后,SQL Prompt將自動為表源分配別名。但是,它無法猜測SQL背后的故事,因此它不能為您提供有意義的別名,只能提供縮寫。除非您提供當前的命名約定作為自定義別名,否則它將盡可能使用表或視圖名稱的首字母生成別名。如果該初始字符已被使用,它將使用兩個字符。
如果您很不幸地被困在“tibbling”約定中(所有表都帶有tbl前綴),則可以告訴SQL Prompt忽略它們(通過將它們添加到“Prefixes to ignore”列表中)。 如果名稱帶有下劃線或連字符,或者由兩個CamelCase單詞組成(例如CustomerAccounts),則在生成兩個字母的別名時,SQL Prompt會將其考慮在內。
否則,當在自聯接中使用SQL Prompt時,SQL Prompt會為同一表創建其他別名。這是我們之前看到的相同代碼,用于獲取表的名稱及其約束,但帶有SQL Prompt的別名建議。它消除了歧義,但是在閱讀此版本時,您是否會如此自信,以確保該ON子句正確無誤,甚至可以理解您打算提供的內容和方式?
SELECT?Object_Schema_Name(O.object_id)?+?'.'?+?O.name?AS?TableName, ??O2.name?+?'?('?+?RTrim(O2.type)?+?')'?COLLATE?DATABASE_DEFAULT?AS?[Constraint] ??FROM?sys.objects?AS?O ????INNER?JOIN?sys.objects?AS?O2 ??????ON?O2.parent_object_id?=?O.object_id ??WHERE?O.is_ms_shipped?=?0 ??ORDER?BY?TableName;
當SQL Prompt分配別名時,它將在當前查詢編輯器窗口中記住該別名,正如您在處理查詢并為其添加子句時,從建議框中為您提供的建議中看到的那樣。
如果現有代碼使用聯接并且不使用表別名,則SQL Prompt將使用綠色曲線在表引用下劃線,表示違反了其ST010代碼分析樣式規則。就個人而言,我更喜歡禁用此規則,除非遵循一種樣式指南,該指南要求涉及多個表源的每個SELECT都使用別名作為限定符。更直接地,Prompt還強調了違反MI003的不合格列名。
如果添加表別名,然后運行Format SQL命令,它將自動使用別名來限定相關的列名(如果啟用了“限定對象名”操作)。
將自定義別名添加到SQL Prompt
您可以根據已建立的命名約定為表或視圖指定用戶定義的別名。與其他提示選項分開,SQL Prompt當前不支持自定義別名的導入或導出,因此您必須一次鍵入一個。
要添加用戶定義的別名,請在“選項”窗口的“別名”窗口的頭部。在“自定義別名”標題下,單擊“新建”,然后輸入對象的名稱及其別名,然后單擊“保存”。
即使您可以提供有意義的自定義別名,它們的添加長度也可能足以阻止它們適合“建議”框中建議的“ON表達式”。 在以下屏幕截圖中,我使用了一個愚蠢的別名TheTablesAsListedInTheSystemViews,只是為了說明我的意思。 它溢出了建議框。
在這種情況下,一種更簡單的解決方案是在查詢或例程完成后但保存之前,使用搜索和替換來更改Prompt提供的默認值。
總結
表別名有時是必不可少的,通常對于幫助闡明更復雜的SQL查詢的目的很有用。 但是,它們并非始終都是必需的,如果沒有JOIN,則在FROM子句中使用它們不會有任何好處。
使用SQL Prompt,我選擇更改建議的簡短別名,以提供更多解釋性的含義。它沒有怨恨,而是根據我選擇的自定義別名為我提供建議。這將節省大量的單調鍵入,對此我深表感謝。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。