logo SQL Prompt教程 我也要发布文档

如何使用SQL语法提示工具SQL Prompt应用非标准的SQL格式


SQL Prompt不仅可以按照您希望的格式精确地格式化代码,还可以帮助您快速切换到其他样式,或者将异常应用于不需要特定样式的SQL脚本的某些部分。

SQL Prompt根据数据库的对象名称、语法和代码片段自动进行检索,为用户提供合适的代码选择。自动脚本设置使代码简单易读--当开发者不大熟悉脚本时尤其有用。安装即可使用,能大幅提高编码效率。

点击下载SQL Prompt免费版


我使用SQL Prompt格式化我的代码;在大多数情况下,我已经定义了标准样式,可以按照我喜欢的方式对代码进行布局。对于特定的任务,我还有几种替代样式,例如比较同一代码的两个版本。

但是,有时候,标准格式对某些代码或该代码的某些部分不起作用。因此,像任何优秀工具一样,SQL Prompt不仅会为您格式化代码,还会为您“取消格式化”,或者允许您有选择地禁用某些部分的格式化。

取消格式化代码

有时,您只是希望代码或代码的某些部分采用非常精简的格式,通常只是因为格式化后的版本占用太多行并且变得难以阅读。例如,考虑清单1中针对WideWorldImporters数据库的简单查询。

SELECT *
  FROM   Sales.Customers

清单1

显然,我不希望在生产应用程序中使用*这样的代码,因此我使用Format SQL命令(或Ctrl KCtrl Y快捷键)应用SQL Prompt自定义样式。我还配置了Prompt Format > Styles选项,以便某些格式化操作作为此命令的一部分运行,包括Expand WildcardsInsert 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,然后从过滤的列表中选择它。

如何使用SQL语法提示工具SQL Prompt应用非标准的SQL格式

当我第一次看到此命令时,我设想在格式化代码后,它就像一个“撤消”按钮,但事实并非如此。它不会撤消您刚刚应用的任何重构操作的影响,但是会删除所有空格字符,并用单个空格字符替换。结果是它从代码中删除了所有漂亮的格式,并将语句的每一位都放在一行上(尽管它可能显示为自动换行,具体取决于它出现的位置或您的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

它将保留注释周围的空间,以确保双连字符(--)注释不会最终注释掉所有剩余的代码。您可以偶尔使用此技巧来防止提示使行长于换行(例如,当您需要在线发布代码时)。

当然,更常见的格式取消需要的不是完整的语句,而只是其中的一部分。幸运的是,如果仅突出显示注释的文本,则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

在网格结果中,突出显示该列,右键单击并选择Copy as IN子句,您可以快速生成用户所需的查询。但是,它几乎有100行。

SELECT *
  FROM   Sales.Customers
  WHERE  CustomerId
  IN
  (
  187,
  509,
  825,
  935,
  952,
  …
  839,
  1000,
  1005,
  1040
  )

清单5

要将查询发送给用户,您可能不希望应用标准格式,这可能会扩展通配符,使查询更长,并且根据格式样式而使列表缩进等等。在这种情况下,您可以仅突出显示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接触代码的特定部分,因为格式化模板不能完全满足您的要求。例如,假设您刚刚花了一些时间完全正确地为该部分代码获取了非标准格式,但现在想对其余的查询再次应用Format SQL

清单5的另一种解决方案是,如果您知道标准样式将完全按照所需的格式设置列表项的格式,则仅是对语句的其余部分禁用格式设置,并且Prompt允许您轻松地做到这一点。只需突出显示列表前面的代码段(在清单5中),并对选定的文本操作应用Disable Formatting。注释将出现在代码部分,告诉SQL Prompt在突出显示的部分开始处禁用格式设置,并在结尾处重新启用它。然后,只需突出显示整个语句并应用您选择的样式即可。

-- 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

请注意,您也可以手动键入格式控制注释,一些间距、大小写和结尾注释不会阻止它们起作用。但是,该方法依赖于解析器看到双连字符注释(--)后跟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

然后,由于麻烦使用自定义格式,因此我希望它保持这种状态,所以我将“禁用”格式用于所选文本仅应用于语句的那些部分。

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

现在,如果我应用Format SQL,它将不会影响代码的那些注释部分。但是,一个问题是该查询中的注释数量现在已失控,这使得该语句更难以阅读。幸运的是,格式控制注释不必单独显示。但是,它必须是该行的第一条评论。在清单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

总结

大多数时候,目标是对所有代码使用相同的标准格式。有时,该格式模板无法完全满足您的需求。为此,SQL Prompt具有可独立于Format SQL命令应用的操作,以取消格式化所选代码或忽略该代码的Format SQL命令。

本教程内容到这里就结束了,希望对您有所帮助~您可以下载SQL Prompt试用版体验一下,也可以继续关注我们了解更多产品资讯~

相关内容推荐:

SQL Prompt 使用教程>>>


想要购买SQL Prompt正版授权,或了解更多产品信息请点击“咨询在线客服”

850×0.png