在 TransactSql.ScriptDom 中为泛型语句创建访问者

本文关键字:语句 创建 访问者 泛型 TransactSql ScriptDom | 更新日期: 2023-09-27 18:35:33

使用 TransactSql.ScriptDom,可以通过扩展 TSqlFragmentVisitor 类来查看 SQL 语句的对象模型。对于每种语句类型,都有一个单独的 Visit 方法,可以重写该方法。但是我想在每种类型的每次访问中放入完全相同的代码。我需要类似通用访问的东西,用于各种语句。我该怎么做?

using Microsoft.SqlServer.TransactSql.ScriptDom;
using System.Reflection;
public class CustomVisitor: TSqlFragmentVisitor
{
    private void DoSomething(dynamic obj)
    {
        foreach (var property in obj.GetType().
            GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {
            // Recursively analyse object model to find specific objects
        }
    }
    // Create table
    public override void Visit(CreateTableStatement node)
    {
        DoSomething(node);
        base.Visit(node);
    }
    // Create view
    public override void Visit(CreateViewStatement node)
    {
        DoSomething(node);
        base.Visit(node);
    }
    // ...
    // Huge number of Visit for different types of statement
}

在 TransactSql.ScriptDom 中为泛型语句创建访问者

我确实找到了各种语句的通用方法:Visit(TSqlStatement node)。代码现在如下所示:

    using Microsoft.SqlServer.TransactSql.ScriptDom;
    using System.Reflection;
    public class CustomVisitor : TSqlFragmentVisitor
    {
        private void DoSomething(dynamic obj)
        {
            foreach (var property in obj.GetType().
                GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                // Recursively analyse object model to find specific objects
            }
        }
        // Generic statement
        public override void Visit(TSqlStatement node)
        {
            DoSomething(node);
            base.Visit(node);
        }
    }
// Generic statement
public override void Visit(TSqlStatement node)
{
    DoSomething(node);
    base.Visit(node);
}

}