從 Log 或參數拿到成串未分行的 SQL 指令,或是查程式碼遇到複雜的 SQL 指令,會讓它規則化一點方便閱讀,除了手工整理,自動排版工具也是種選擇。

例如以下這段縮排、大小寫無規則的 T-SQL:(我猜有 Coding-Style 潔癖的人會想把作者的頭扭下來)

;WITH SupportCTE (RowNum, Name, CodeName, Engineer,Engineers) AS
(
    select 1, A.Name, A.CodeName, 
    MIN(B.Engineer), CAST(MIN(B.Engineer) 
        as varchar(max)) as Engineers from AppSystem A join AppSupport B 
    on A.Name = B.AppName Group By A.Name, A.CodeName
    union all
    SELECT A.RowNum + 1, A.Name, A.CodeName, B.Engineer, 
           CAST(A.Engineers + ', ' + B.Engineer AS VARCHAR(MAX)) As Supports
    FROM SupportCTE A JOIN AppSupport B ON A.Name = B.AppName AND B.Engineer > A.Engineer 
)
 
SELECT * FROM SupportCTE

SQL 指令排版工具的選擇不少,T-SQL 的話有一套歷史悠久的 Poor Man's T-SQL Formatter,提供 Visual Studio 擴充套件、SSMS 擴充套件等形式,還有線上版。這兩年我愛上 VSCode 的輕巧及數不盡的擴充套件,除了用它寫 C# 以外的語言(例如:C/C++PythonPowerShellGOnode.js),也常把它當成跑小工具的平台(例如:GitGraph),這篇文章就介紹怎麼用 VSCode 自動排版 SQL。

微軟有個 mssql extension for VSCode,其實也有內建 Formatter 功能,安裝之後編輯 .sql 檔只要按下 Ctrl-K、Ctrl-D 就會自動排版,只是結果不甚理想:

Poor Man 也有出 VSCode 套件。在擴充套件區輸入 Poor Man 找到 Poor Man's T-SQL Formatter:

安裝後,.sql 編輯視窗的右鍵選單會多出 Format SQL (Ctrl+K Shift-F) 選項:

執行即可用它排出縮排規則、大小寫更一致的效果:

不過 Poor Man 只針對 T-SQL,用在其他 DB 如 ORACLE 時會出現警示,執行效果不佳,例如:

create or replace function FN_SQR(n number) 
return number is FunctionResult number;
begin
  FunctionResult := n * n;
  DBMS.SLEEP(0.01); dbms_output.put_line(n);
  return(FunctionResult);
end FN_SQR;

試圖用 Poor Man 重排時會彈出無法解析的提示,若選擇強制執行(Format Anyway),會變成:

我找到另一套老牌 SQL Formatter (基於 sql-formatter-plus npm Package):

它支援 Standard SQL、Couchbase N1QL、IBM DB2、Oracle PL/SQL 等多種資料庫:

不過,SQL Formatter 也將自己註冊成 .sql 的自動排版工具,按下 Ctrl-K、Ctrl-D 時會跳出提示要你選擇 SQLServer Extension 或是 SQL Formatter,更快一點的做法是用右鍵選單 Format Document with...:

執行結果如下,不如 Poor Man 賞心悅目,但至少關鍵字都有正確解析。

老話一句,兩套都是開源專案,覺得不順手用得不開心是自己能力不足,與開發者無關。哈!

Introduce to how to format SQL script with VSCode.


Comments

# by Charlie Ku

我想補充一下 我看到黑暗執行序大大分享,馬上就把自己的 VS Code 也裝上SQL Formatter 但是嘗試了一下發現沒有效果 後來我又去查了怎麼用找到了另一個插件"SQL Formatter Mod",可以正常工作,使用方式需要自己先設置快捷鍵 補充一下我使用的SQL是Oracle

Post a comment


56 - 38 =