C#学习教程:如何使用Microsoft.SqlServer.Management.SqlParser中的类将T-SQL解析为返回ParseResult的AST共享方法,我似乎无法对ParseResult执行任何操作。我怎样才能得到我的sql语句的抽象语法树,或者只是解析来自sql的元数据标记。我做了一些研究,发现我可以使用反射生成一个使用SqlScript.WriteXml解析的信息xml文件。下面是示例代码,不知道有没有更好的方法。varrst=Parser.Parse(File.ReadAllText(@"*.sql"));varfieldInfo=rst.GetType().GetField("sqlScript",BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.GetField);varscript=fieldInfo.GetValue(第一个);varwriter=XmlWriter.Create("*.xml");script.GetType().InvokeMember("WriteXml",BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.InvokeMethod,null,script,newobject[]{writer});writer.Close();我很高兴你发现了AST!直接使用它需要使用动态变量来访问内部Microsoft.SqlServer.Management.SqlParser.SqlCodeDom命名空间中的.Child对象集合。我建议访问现有的Xml字符串属性而不是调用WriteXml。这样就不必处理在XML注释中嵌套SQL注释所引起的问题(不能在XML注释中--变成--)。varrst=Parser.Parse(File.ReadAllText(@"*.sql"));varscript=rst.GetType().GetProperty("脚本",BindingFlags.NonPublic|BindingFlags.Instance).GetValue(rst);varxml=script.GetType().BaseType.GetProperty("Xml").GetValue(script)作为字符串;如果您真的愿意只接受元数据令牌,我在这里找到了一个PowerShell示例;它起到了作用(为了完整性包含了样板元数据工厂):以上是C#学习教程:如何使用Microsoft.SqlServer.Management.SqlParser中的类将T-SQL解析为AST。了解更多C#学习教程,希望大家多多关注—//usingMicrosoft.SqlServer.Management.SqlParser.Parser;//...varsql=File.ReadAllText(@"*.sql");varscanner=newScanner(newParseOptions());int扫描器状态=0;scanner.SetSource(sql,0);varallTokens=newList();MSSQL_Token_JScurToken=null;做{curToken=MSSQL_Token_JS.GetNext(scanner,sql,refscannerState);allTokens.Add(curToken);}while(curToken.Value!=Tokens.EOF);//...publicclassMSSQL_Token_JS{publicreadonlystringSourceSQL;公共只读令牌值;公共只读字符串文本;公共只读intScannerState;publicreadonlyint开始;publicreadonlyint结束;公共只读布尔IsPairMatch;publicreadonlyboolIsExecAutoParamHelp;privateMSSQL_Token_JS(stringSourceSQL,inttokenId,intScannerState,intStart,intEnd,boolIsPairMatch,boolIsExecAutoParamHelp){this.SourceSQL=SourceSQL;this.Value=(Tokens)tokenId;if(this.Value!=Tokens.EOF){this.Text=SourceSQL.Substring(Start,End-Start+1);}this.ScannerState=ScannerState;this.Start=开始;this.End=结束;this.IsPairMatch=IsPairMatch;this.IsExecAutoParamHelp=IsExecAutoParamHelp;}publicstaticMSSQL_Token_JSGetNext(Scannerscanner,stringSourceSQL,refintScannerState){intstart,end;boolisPairMatch,isExecAutoParamHelp;inttokenId=scanner.GetNext(refScannerState,outstart,outend,outisPairMatch,outisExecAutoParamHelp);返回新的MSSQL_Token_JS(SourceSQL,tokenId,ScannerState,start,end,isPairMatch,isExecAuto参数帮助);}publicoverridestringToString(){returnString.Format("{0}:{1}",this.Value,this.Text);}}本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
