Microsoft.SqlServer.Management.SqlParserを使ってT-SQLをパースする方法です。
#DLLロード Add-Type -AssemblyName "Microsoft.SqlServer.Management.SqlParser, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" #スキャナーの準備 $ParseOptions = New-Object Microsoft.SqlServer.Management.SqlParser.Parser.ParseOptions $ParseOptions.BatchSeparator = 'GO' $Parser = new-object Microsoft.SqlServer.Management.SqlParser.Parser.Scanner($ParseOptions) #SQLの読み込み $Sql = "Select * from table_a inner join table_b on table_a.sid=table_b.sid; go; update t_able set a1='a1';" $Parser.SetSource($Sql,0) #パース用変数の初期化 $Token=[Microsoft.SqlServer.Management.SqlParser.Parser.Tokens]::TOKEN_SET $Start =0 $End = 0 $State =0 $IsEndOfBatch = $false $IsMatched = $false $IsExecAutoParamHelp = $false $EOF = [Microsoft.SqlServer.Management.SqlParser.Parser.Tokens]::EOF #EOFまでトークンを順番に取得する while(($Token = $Parser.GetNext([ref]$State ,[ref]$Start, [ref]$End, [ref]$IsMatched, [ref]$IsExecAutoParamHelp ))-ne $EOF) { try{ ($TokenName =[Microsoft.SqlServer.Management.SqlParser.Parser.Tokens]$Token) | Out-Null $str = $Sql.Substring($Start,($end-$Start)+1) Write-Host "$TokenName : $str" }catch{ $TokenName = $null } }
実行結果
TOKEN_SELECT : Select TOKEN_FROM : from TOKEN_ID : table_a TOKEN_INNER : inner TOKEN_JOIN : join TOKEN_ID : table_b TOKEN_ON : on TOKEN_ID : table_a TOKEN_ID : sid TOKEN_ID : table_b TOKEN_ID : sid LEX_BATCH_SEPERATOR : go TOKEN_UPDATE : update TOKEN_ID : t_able TOKEN_SET : set TOKEN_ID : a1 TOKEN_STRING : 'a1'
参照した情報
* Scannerクラス
* Tokenクラス
* Tokens列挙体
* GetNextメソッド
* コードサンプル