最近工作上有個需求,就是要不斷的產生相同的 SQL Script,只是裡面塞的內容會有所不同,用手工藝產生最為簡單但也最浪費時間,而這時 T4 技術就是一個很適合的選擇,它可以利用 template 的方式填入諸如程式碼、SQL Script 的格式,然後在裡面插入變數,最後產出文字結果。例如下列 SQLTextTemplate.tt 的範例

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<# int a =0;  #>
IF NOT EXISTS (SELECT 1 FROM [dbo].[TestTable] WHERE ID = <#= ID #>)
BEGIN
	INSERT INTO [dbo].[TestTable] (ID, Name, [Description]) VALUES (<#= ID #>, '<#= Name #>', '<#= Desc #>');
END;

不看最上面的宣告,底下可以看出這是一個 insert 的 SQL 語法,只是中間用 <#= variable #> 的方式插入變數,用來動態產生 SQL 語法。需注意的是,在新增 T4 檔案時,”自訂工具屬性” 要從 TextTemplatingFileGenerator 改為 TextTemplatingFilePreprocessor

接下來為 T4 新增變數,所以需要宣告相對應的類別,程式碼如下:

public partial class SQLTextTemplate
{
    public string ID { get; set; }
    public string Name { get; set; }
    public string Desc { get; set; }
}

之後是產出文字結果:

SQLTextTemplate sQTTextTemplate = new SQLTextTemplate
{
    ID = "3",
    Name = "aaa3",
    Desc = "aaa4"
};

string result = sQTTextTemplate.TransformText();
Console.WriteLine(result);

T4 是個相當好用的技術,雖然是個老技術,但直到現在依然實用

參考資料