C# 通用SQL解析器,从SQL中获取子查询
我正在使用解析SQL Select查询,不清楚的是GSP的文档没有说明如何提取子查询,例如,如果我有以下SQL:C# 通用SQL解析器,从SQL中获取子查询,c#,sql,parsing,select,C#,Sql,Parsing,Select,我正在使用解析SQL Select查询,不清楚的是GSP的文档没有说明如何提取子查询,例如,如果我有以下SQL: select * from table1 join (subquery) as T2 on table1.a=T2.a 其中子查询是另一个重新选择查询。如何获取子查询字符串,以便对其应用GSP规则 非常感谢您的帮助这是他们提供的演示代码。。。(: " 本演示演示如何快速查找脚本中的各种SQL语句。查找PLSQL块/包/过程/函数中的所有SQL语句;查找select/delete/
select * from table1 join (subquery) as T2 on table1.a=T2.a
其中子查询是另一个重新选择查询。如何获取子查询字符串,以便对其应用GSP规则
非常感谢您的帮助这是他们提供的演示代码。。。(: " 本演示演示如何快速查找脚本中的各种SQL语句。查找PLSQL块/包/过程/函数中的所有SQL语句;查找select/delete/update语句中的嵌套子查询;查找union select语句中的查询;查找where子句中的子查询、select list等。 "
使用系统;
使用System.Collections.Generic;
使用系统文本;
使用System.IO;
使用gudusoft.gsqlparser;
使用gudusoft.gsqlparser.Units;
命名空间查找子查询
{
类prg
{
静态void Main(字符串[]参数)
{
int c=Environment.TickCount;
如果(args.Length==0)
{
WriteLine(“{0}脚本文件”,“语法检查”);
返回;
}
TGSqlParser sqlparser=新的TGSqlParser(tdbvendo.DbVMssql);
sqlparser.Sqlfilename=args[0];
int-iRet=sqlparser.Parse();
如果(iRet==0)
{
foreach(sqlparser.SqlStatements中的TCustomSqlStatement stmt)
{
printsmt(stmt);
}
}
其他的
{
WriteLine(“在输入sql中发现语法错误:”);
WriteLine(sqlparser.ErrorMessages);
}
}
静态void printsmt(TCustomSqlStatement pstmt)
{
Console.WriteLine(pstmt.AsText+“\n”);
对于(int j=0;j
Thx对于示例,我设法运行您的代码printsmt在新行中打印每条语句。以下是输出:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using gudusoft.gsqlparser;
using gudusoft.gsqlparser.Units;
namespace findsubquerys
{
class prg
{
static void Main(string[] args)
{
int c = Environment.TickCount;
if (args.Length == 0)
{
Console.WriteLine("{0} scriptfile", "syntaxcheck");
return;
}
TGSqlParser sqlparser = new TGSqlParser(TDbVendor.DbVMssql);
sqlparser.Sqlfilename = args[0];
int iRet = sqlparser.Parse();
if (iRet == 0)
{
foreach (TCustomSqlStatement stmt in sqlparser.SqlStatements)
{
printStmt(stmt);
}
}
else
{
Console.WriteLine("Syntax error found in input sql:");
Console.WriteLine(sqlparser.ErrorMessages);
}
}
static void printStmt(TCustomSqlStatement pstmt)
{
Console.WriteLine(pstmt.AsText+"\n");
for (int j = 0; j < pstmt.ChildNodes.Count(); j++)
{
if (pstmt.ChildNodes[j] is TCustomSqlStatement)
{
printStmt((TCustomSqlStatement)(pstmt.ChildNodes[j]));
}
}
}
} //class
}