如何使用SQL語法提示工具SQL Prompt應用非標準的SQL格式
SQL Prompt不僅可以按照您希望的格式精確地格式化代碼,還可以幫助您快速切換到其他樣式,或者將異常應用于不需要特定樣式的SQL腳本的某些部分。
SQL Prompt根據(jù)數(shù)據(jù)庫的對象名稱、語法和代碼片段自動進行檢索,為用戶提供合適的代碼選擇。自動腳本設置使代碼簡單易讀--當開發(fā)者不大熟悉腳本時尤其有用。安裝即可使用,能大幅提高編碼效率。
我使用SQL Prompt格式化我的代碼;在大多數(shù)情況下,我已經(jīng)定義了標準樣式,可以按照我喜歡的方式對代碼進行布局。對于特定的任務,我還有幾種替代樣式,例如比較同一代碼的兩個版本。
但是,有時候,標準格式對某些代碼或該代碼的某些部分不起作用。因此,像任何優(yōu)秀工具一樣,SQL Prompt不僅會為您格式化代碼,還會為您“取消格式化”,或者允許您有選擇地禁用某些部分的格式化。
取消格式化代碼
有時,您只是希望代碼或代碼的某些部分采用非常精簡的格式,通常只是因為格式化后的版本占用太多行并且變得難以閱讀。例如,考慮清單1中針對WideWorldImporters數(shù)據(jù)庫的簡單查詢。
SELECT * FROM Sales.Customers
清單1
顯然,我不希望在生產(chǎn)應用程序中使用*這樣的代碼,因此我使用Format SQL命令(或Ctrl K,Ctrl Y快捷鍵)應用SQL Prompt自定義樣式。我還配置了Prompt Format > Styles選項,以便某些格式化操作作為此命令的一部分運行,包括Expand Wildcards和Insert Semicolons。我最終得到了一條長達32行的語句,如清單2所示。
SELECT CustomerID, CustomerName, BillToCustomerID, CustomerCategoryID, BuyingGroupID, PrimaryContactPersonID, AlternateContactPersonID, DeliveryMethodID, DeliveryCityID, PostalCityID, CreditLimit, AccountOpenedDate, StandardDiscountPercentage, IsStatementSent, IsOnCreditHold, PaymentDays, PhoneNumber, FaxNumber, DeliveryRun, RunPosition, WebsiteURL, DeliveryAddressLine1, DeliveryAddressLine2, DeliveryPostalCode, DeliveryLocation, PostalAddressLine1, PostalAddressLine2, PostalPostalCode, LastEditedBy, ValidFrom, ValidTo FROM Sales.Customers;
清單2
我希望SELECT列表采用更簡潔的格式,為此,我可以使用一個有趣的動作,稱為unformat。突出顯示清單2中的整個語句,然后從“操作”菜單中,開始輸入unformat,然后從過濾的列表中選擇它。
當我第一次看到此命令時,我設想在格式化代碼后,它就像一個“撤消”按鈕,但事實并非如此。它不會撤消您剛剛應用的任何重構(gòu)操作的影響,但是會刪除所有空格字符,并用單個空格字符替換。結(jié)果是它從代碼中刪除了所有漂亮的格式,并將語句的每一位都放在一行上(盡管它可能顯示為自動換行,具體取決于它出現(xiàn)的位置或您的SSMS設置)。
SELECT Customers.CustomerID, Customers.CustomerName, Customers.BillToCustomerID, Customers.CustomerCategoryID, Customers.BuyingGroupID, Customers.PrimaryContactPersonID, Customers.AlternateContactPersonID, Customers.DeliveryMethodID, Customers.DeliveryCityID, Customers.PostalCityID, Customers.CreditLimit, Customers.AccountOpenedDate, Customers.StandardDiscountPercentage, Customers.IsStatementSent, Customers.IsOnCreditHold, Customers.PaymentDays, Customers.PhoneNumber, Customers.FaxNumber, Customers.DeliveryRun, Customers.RunPosition, Customers.WebsiteURL, Customers.DeliveryAddressLine1, Customers.DeliveryAddressLine2, Customers.DeliveryPostalCode, Customers.DeliveryLocation, Customers.PostalAddressLine1, Customers.PostalAddressLine2, Customers.PostalPostalCode, Customers.LastEditedBy, Customers.ValidFrom, Customers.ValidTo FROM Sales.Customers;
清單3
它將保留注釋周圍的空間,以確保雙連字符(--)注釋不會最終注釋掉所有剩余的代碼。您可以偶爾使用此技巧來防止提示使行長于換行(例如,當您需要在線發(fā)布代碼時)。
當然,更常見的格式取消需要的不是完整的語句,而只是其中的一部分。幸運的是,如果僅突出顯示注釋的文本,則unformat操作可在語句甚至注釋的任何部分上起作用。我處理過很多次的地方是在處理大量項目時,通常是在使用“Copy as IN”子句功能時。
假設您的用戶要求一個查詢,該查詢將僅向他們顯示已訂購價值超過18000美元商品的那些客戶的詳細信息。清單4將為那些“高支出”客戶提供CustomerId值清單。
SELECT DISTINCT CustomerId--,Quantity * OrderLines.UnitPrice FROM Sales.Orders JOIN Sales.OrderLines ON OrderLines.OrderID = Orders.OrderID WHERE Quantity * OrderLines.UnitPrice > 18000;
清單4
在網(wǎng)格結(jié)果中,突出顯示該列,右鍵單擊并選擇Copy as IN子句,您可以快速生成用戶所需的查詢。但是,它幾乎有100行。
SELECT * FROM Sales.Customers WHERE CustomerId IN ( 187, 509, 825, 935, 952, … 839, 1000, 1005, 1040 )
清單5
要將查詢發(fā)送給用戶,您可能不希望應用標準格式,這可能會擴展通配符,使查詢更長,并且根據(jù)格式樣式而使列表縮進等等。在這種情況下,您可以僅突出顯示ID列表,應用unformat操作,添加一些回車/換行符,查詢將如清單6所示。
SELECT * FROM Sales.Customers WHERE CustomerId IN ( 187, 509, 825, 935, 952, 1003, 415, 529, 583, 1006, 1018, 1056, 96, 166, 201, 472, 489, 863, 999, 15, 32, 45, 401, 899, 948, 988, 101, 527, 961, 26, 105, 427, 521, 813, 71, 413, 420, 480, 821, 37, 943, 950, 1010, 50, 102, 170, 460, 492, 560, 578, 815, 16, 117, 405, 410, 533, 922, 949, 954, 498, 829, 1017, 42, 67, 418, 834, 854, 861, 874, 911, 858, 892, 894, 437, 907, 912, 962, 14, 107, 524, 550, 930, 973, 40, 114, 431, 490, 807, 832, 839, 1000, 1005, 1040 )
清單6
選擇性禁用格式
就像SQL Prompt在格式化代碼方面一樣出色,有時,您只是不希望SQL Prompt接觸代碼的特定部分,因為格式化模板不能完全滿足您的要求。例如,假設您剛剛花了一些時間完全正確地為該部分代碼獲取了非標準格式,但現(xiàn)在想對其余的查詢再次應用Format SQL。
清單5的另一種解決方案是,如果您知道標準樣式將完全按照所需的格式設置列表項的格式,則僅是對語句的其余部分禁用格式設置,并且Prompt允許您輕松地做到這一點。只需突出顯示列表前面的代碼段(在清單5中),并對選定的文本操作應用Disable Formatting。注釋將出現(xiàn)在代碼部分,告訴SQL Prompt在突出顯示的部分開始處禁用格式設置,并在結(jié)尾處重新啟用它。然后,只需突出顯示整個語句并應用您選擇的樣式即可。
-- SQL Prompt formatting off SELECT * FROM Sales.Customers WHERE CustomerId IN -- SQL Prompt formatting on ( 187, 509, 825, 935, 952, 1003, 415, 529, 583, 1006, 1018, 1056, 96, 166, 201, 472, 489, 863, 999, 15, 32, 45, 401, 899, 948, 988, 101, 527, 961, 26, 105, 427, 521, 813, 71, 413, 420, 480, 821, 37, 943, 950, 1010, 50, 102, 170, 460, 492, 560, 578, 815, 16, 117, 405, 410, 533, 922, 949, 954, 498, 829, 1017, 42, 67, 418, 834, 854, 861, 874, 911, 858, 892, 894, 437, 907, 912, 962, 14, 107, 524, 550, 930, 973, 40, 114, 431, 490, 807, 832, 839, 1000, 1005, 1040 );
清單7
請注意,您也可以手動鍵入格式控制注釋,一些間距、大小寫和結(jié)尾注釋不會阻止它們起作用。但是,該方法依賴于解析器看到雙連字符注釋(--)后跟SQL Prompt格式化Off(或On),因此,如果由于某種原因您不能或不使用雙連字符注釋,那么您將無法使用此控件方法。
在清單8中,我決定該SET子句應該全部顯示在一行上,該WHERE子句中的最后兩個布爾值也應該顯示在同一行上,因此我將unformat操作選擇性地應用在了每個部分。
UPDATE Sales.CustomerCategories SET CustomerCategories.CustomerCategoryID = 1, CustomerCategories.CustomerCategoryName = N'New', CustomerCategories.LastEditedBy = 0 WHERE CustomerCategories.CustomerCategoryID = 1 AND CustomerCategories.CustomerCategoryName = N'New' AND CustomerCategories.LastEditedBy = 0;
清單8
然后,由于麻煩使用自定義格式,因此我希望它保持這種狀態(tài),所以我將“禁用”格式用于所選文本僅應用于語句的那些部分。
UPDATE Sales.CustomerCategories -- A code comment -- SQL Prompt formatting off SET CustomerCategories.CustomerCategoryID = 1, CustomerCategories.CustomerCategoryName = N'New', CustomerCategories.LastEditedBy = 0 -- SQL Prompt formatting on WHERE CustomerCategories.CustomerCategoryID = 1 -- Another comment -- SQL Prompt formatting off AND CustomerCategories.CustomerCategoryName = N'New' AND CustomerCategories.LastEditedBy = 0; -- SQL Prompt formatting on
清單9
現(xiàn)在,如果我應用Format SQL,它將不會影響代碼的那些注釋部分。但是,一個問題是該查詢中的注釋數(shù)量現(xiàn)在已失控,這使得該語句更難以閱讀。幸運的是,格式控制注釋不必單獨顯示。但是,它必須是該行的第一條評論。在清單10中,第一個Off控件注釋仍然有效,但第二個注釋無效。
UPDATE Sales.CustomerCategories -- SQL Prompt formatting off –- A code comment SET CustomerCategories.CustomerCategoryID = 1, CustomerCategories.CustomerCategoryName = N'New', CustomerCategories.LastEditedBy = 0 -- SQL Prompt formatting on WHERE CustomerCategories.CustomerCategoryID = 1 -- Another comment -- SQL Prompt formatting off AND CustomerCategories.CustomerCategoryName = N'New' AND CustomerCategories.LastEditedBy = 0; -- SQL Prompt formatting on
清單10
總結(jié)
大多數(shù)時候,目標是對所有代碼使用相同的標準格式。有時,該格式模板無法完全滿足您的需求。為此,SQL Prompt具有可獨立于Format SQL命令應用的操作,以取消格式化所選代碼或忽略該代碼的Format SQL命令。
本教程內(nèi)容到這里就結(jié)束了,希望對您有所幫助~您可以下載SQL Prompt試用版體驗一下,也可以繼續(xù)關(guān)注我們了解更多產(chǎn)品資訊~
相關(guān)內(nèi)容推薦:
想要購買SQL Prompt正版授權(quán),或了解更多產(chǎn)品信息請點擊“咨詢在線客服”