SQL Server(T-SQL)格式化工具

粘贴一段 T-SQL 查询,得到格式一致的 SQL。方括号 [标识符]、@参数,以及 TOP、OPTION 等 SQL Server 子句都能正确处理。

一条 SQL Server 查询,格式化前后对比

下面这条未格式化的查询就是上方编辑器里加载的示例,输出则是本工具在默认选项下返回的原始结果,没有任何手工修饰。

粘贴进来的内容
WITH ranked AS (SELECT [c].[CustomerID], [o].[OrderID], [o].[Total], ROW_NUMBER() OVER (PARTITION BY [c].[CustomerID] ORDER BY [o].[Total] DESC) AS rn FROM [dbo].[Customers] [c] INNER JOIN [dbo].[Orders] [o] ON [o].[CustomerID] = [c].[CustomerID] WHERE [o].[OrderDate] >= @StartDate AND [c].[Region] = @Region) SELECT TOP 100 * FROM ranked WHERE rn = 1 AND [Total] > @MinTotal ORDER BY [Total] DESC
格式化后的输出
WITH
  ranked AS (
    SELECT
      [c].[CustomerID],
      [o].[OrderID],
      [o].[Total],
      ROW_NUMBER() OVER (
        PARTITION BY
          [c].[CustomerID]
        ORDER BY
          [o].[Total] DESC
      ) AS rn
    FROM
      [dbo].[Customers] [c]
      INNER JOIN [dbo].[Orders] [o] ON [o].[CustomerID] = [c].[CustomerID]
    WHERE
      [o].[OrderDate] >= @StartDate
      AND [c].[Region] = @Region
  )
SELECT
  TOP 100 *
FROM
  ranked
WHERE
  rn = 1
  AND [Total] > @MinTotal
ORDER BY
  [Total] DESC

它能处理的 SQL Server 语法

通用格式化工具往往会破坏方言特有的语法,或者干脆拒绝处理。以下是本工具针对 SQL Server 做过测试的语法结构。

@Parameter

T-SQL 参数会被检测出来并按名称分组。

[identifier]

方括号标识符会保留方括号及其内部间距。

TOP (n)

作为 SELECT 子句的一部分格式化,而不是被单独拆出。

@@ROWCOUNT

系统变量不会被当作参数报告。

SQL Server 格式化工具常见问题

@参数会被识别吗?

会,并且 @@ROWCOUNT 这类系统变量会被正确排除,因此参数面板中只出现真正的参数。每个参数填一次,查询中所有出现处会一起更新。

它能格式化包含多个 CTE 的查询吗?

可以。查询中的每个 WHERE 子句都会按所属的 CTE 列出,你可以挑一个用 AND/OR 树或节点图来编辑,查询的其余部分保持不变。

我的查询会被发送到服务器吗?

不会。一切都在你的浏览器中运行,因此库表名和任何内嵌的值都不会离开你的机器。

带空格或保留字的方括号标识符能处理吗?

能。像 [Order Details] 这样的名字会被读作一个标识符,方括号和内部空格都算在内,名字里的空格绝不会被当成词法边界,方括号里的保留字也绝不会被当作关键字改写大小写。

能格式化不完整的 T-SQL 语句吗?

能。片段就可以用——包括只有 WHERE [o].[OrderDate] >= @StartDate——因为没有任何环节依赖完整解析。从一个很长的存储过程里复制出一段谓词、单独拿出来改,正是最常见的用法。

OPTION (RECOMPILE) 这类查询提示会被保留吗?

会。提示会在原位置带过,不会被重排或丢弃,所以格式化后的查询仍是你正在调优的那条查询,拿回的执行计划也仍是你在测量的那一个。