استفاده از SQLDom برای آنالیز عبارات T-SQL، قسمت دوم
نویسنده: وحید نصیری
تاریخ: ۱۳۹۳/۰۷/۳۰ ۱۳:۱۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
using System;
using System.Linq;
using Microsoft.SqlServer.TransactSql.ScriptDom;
namespace DbCop
{
public class SelectStarExpressionVisitor : TSqlFragmentVisitor
{
public override void ExplicitVisit(SelectStarExpression node)
{
Console.WriteLine(
"`Select *` detected @StartOffset:{0}, Line:{1}, T-SQL: {2}",
node.StartOffset,
node.StartLine,
string.Join(string.Empty, node.ScriptTokenStream.Select(x => x.Text)).Trim());
base.ExplicitVisit(node);
}
}
} public static class GenericVisitor
{
public static void Start(string tSql, TSqlFragmentVisitor visitor)
{
IList<ParseError> errors;
TSqlScript sqlFragment;
using (var reader = new StringReader(tSql))
{
var parser = new TSql120Parser(initialQuotedIdentifiers: true);
sqlFragment = (TSqlScript)parser.Parse(reader, out errors);
}
if (errors != null && errors.Any())
{
var sb = new StringBuilder();
foreach (var error in errors)
sb.AppendLine(error.Message);
throw new InvalidOperationException(sb.ToString());
}
sqlFragment.Accept(visitor);
}
} var tsql = @"WITH ctex AS ( SELECT * FROM sys.objects ) SELECT * FROM ctex"; GenericVisitor.Start(tsql, new SelectStarExpressionVisitor());