14. Parse してみる
TSqlParser クラス
Parse メソッドを使う
using Microsoft.SqlServer.TransactSql.ScriptDom;
using System.Collections.Generic;
using System.IO;
var parser = new TSql110Parser(false);
IList<ParseError> errors;
TSqlFragment parsed;
using (var query = new StringReader("select * from Table1")) {
parsed = parser.Parse(query, out errors);
}
20. もうちょっと細かいとこまで
例:SELECT で指定している項目の数を数える
http://msdn.microsoft.com/ja-
jp/library/microsoft.sqlserver.transactsql.scriptdom.selectelement.aspx
SELECT @Id = A.Id, @Name = B.Name
FROM ( SELECT * FROM Table1 WHERE Id = 1) A
INNER JOIN Table2 B ON ( A.USERID = B.ID )
21. もうちょっと細かいとこまで
TSqlFragmentVisitor
SELECT で指定している項目全ての件数を数える Visitor
public class SelectElementVisitor : TSqlFragmentVisitor {
public int Count { get; set; }
public override void Visit(SelectElement node) {
Count++;
base.Visit(node);
}
}
22. もうちょっと細かいとこまで
TSqlConcreteFragmentVisitor
SELECT で指定している “*” の件数を数える Visitor
public class SelectStarVisitor : TSqlFragmentVisitor {
public int Count { get; set; }
public override void Visit(SelectStarExpression node) {
Count++;
base.Visit(node);
}
}
23. もうちょっと細かいとこまで
カスタム Visitor を利用する
var q = @"SELECT @Id = A.Id, @Name = B.Name
FROM ( SELECT * FROM Table1 WHERE Id = 1) A
INNER JOIN Table2 B ON ( A.USERID = B.ID )";
var f = new TSql110Parser(false)
.Parse(new StringReader(q), out errors);
var v1 = new SelectElementVisitor();
var v2 = new SelectStarVisitor();
f.Accept(v1);
f.Accept(v2);
Console.WriteLine(v1.Count); // 3
Console.WriteLine(v2.Count); // 1
24. もうちょっと細かいとこまで
Generator – バージョン毎に用意されてる
Sql80ScriptGenerator - SQL Server 2000用
Sql90ScriptGenerator - SQL Server 2005用
Sql100ScriptGenerator - SQL Server 2008用
Sql110ScriptGenerator - SQL Server 2012用
イマイチ違いが判らず
…
40. 参考資料
Microsoft SQL Server 2012 Feature Pack
http://www.microsoft.com/ja-jp/download/details.aspx?id=29065
Microsoft.SqlServer.TransactSql.ScriptDom 名前空間
http://msdn.microsoft.com/ja-jp/library/hh215705.aspx
Visual Studio のデータベース機能の API リファレンス
http://msdn.microsoft.com/ja-jp/library/dd193281(v=vs.100).aspx
ANTLR
http://www.antlr.org/