[ASP.NET]正規運算式剖析SQL基本指令(Using Regular Expression to parse SQL)

  • 1180
  • 0

摘要:[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

結束