摘要:[ASP.NET]正規運算式剖析SQL指令(Using Regular Expression to parse SQL)
在這邊會去剖析基本的SQL指令:update,其他的像是select, insert, delete都類似,如法炮製即可
首先我們定義常常用到的Reg字串集合:
Dim strAny As String = "[\s\S]*" '任何字元或是換行
Dim strSpaceOrBr As String = "[\s\n]*" '任何空白或是換行
然後定義table的命名規則,限定英文以及數字,a-zA-Z也可以改成\w,底線_是因為有的View或是Storeprocedure或function的名稱會有底線,
逗號,是因為可能需要傳入參數到Storeprocedure或function,句號.也是因為Storeprocedure或function大多是dbo.usp_OOXX或dbo.udf_OOXX之類的
Dim strTableNameReg As String = "[a-zA-Z_\,\(,\)\.]" 'tablename的字元規則,舉例來說tmperson的英文字代表a-z,舉例來說uvw_insure代表a-z還有_底線
定義update set where的pattern,
(?<tablegroup>\w+) 這個就是用來取得tableName,\w就表示是英文以及數字,+就是一個以上,取名稱?<tablegroup>是方便等等利用程式碼取出左括號右括號的裡面的內容,而在?<setgroup>裡面,因為通常set更新的欄位可能會是多個,並且用逗號,區隔(例如:update employee set idno = 'A123456789',name='王先生'where uid = '78910'),所以?<setgroup>的結尾最後會有一個加號+,表示至少更新一個欄位
然後再用Regex類別去剖析SQL即可,假設原本的SQL是update employee set idno = 'A123456789',name = '王先生' where sno = 777的話
陣列aryAssignValues會得到 idno = 'A123456789'還有name = '王先生'這兩筆資料
第一次跑回圈的話,strColumnName變數會得到字串idno
strValue會得到A123456789
'開始比對,取得update的細節, 會取得tablename以及update的欄位名稱還有所有欄位的value
Dim ma As Match = Regex.Match(strSQL, strUpdateSetWhere, RegexOptions.IgnoreCase Or RegexOptions.Multiline)
If ma.Success = True Then
'取得tablename
lstTableNames.Add(ma.Groups("tablegroup").Value.Trim)
'取得更新的細節 ex:idno = 'A123456789',cname = '王先生'
Dim aryAssignValues() As String = ma.Groups("setgroup").Value.Split(",")
'分析每一筆更新的細節
For Each strAssignValue As String In aryAssignValues
Dim strColumnName As String = "" '欄位名稱,ex:idno
Dim strValue As String = "" '更新的value ,ex: A123456789 或 王先生 或 數字
If strAssignValue.Split("=").Length = 2 Then
strColumnName = strAssignValue.Split("=")(0).Trim
strValue = RemoveAddQuot(strAssignValue.Split("=")(1).Trim)
End If
Next
'where group的細節的取法跟setgroup差不多
End If
結束