作为一个大型项目的一部分,我正在开发一个表单,用户可以将SQL粘贴到文本框中,然后单击各种按钮来更改其中的内容。
例如,一个将它全部转换为小写,一个删除 - 和/ * * / comments,一个删除换行符(在某些不处理这些换行符的情况下很有用)。
最后一个采用未格式化的字符串(就像我将线路分开的字符串一样)并使其可读。
到目前为止,我已经在一个功能中得到了以下功能,这个功能对于一些关键词非常有效(我不是在这里只是一个可以帮助用户的详尽功能):
Function FormatSQL(str As String) As String
SSelect:
Do Until InStr(LCase(str), " select ") = 0
str = Replace(LCase(str), " select ", vbCrLf & "select ")
Loop
BSelect:
Do Until InStr(LCase(str), "(select ") = 0
str = Replace(LCase(str), "(select ", "(" & vbCrLf & "select ")
Loop
From:
Do Until InStr(LCase(str), " from ") = 0
str = Replace(LCase(str), " from ", vbCrLf & "from ")
Loop
Where:
Do Until InStr(LCase(str), " where ") = 0
str = Replace(LCase(str), " where ", vbCrLf & "where ")
Loop
Having:
Do Until InStr(LCase(str), " having ") = 0
str = Replace(LCase(str), " having ", vbCrLf & "having ")
Loop
GroupBy:
Do Until InStr(LCase(str), " group by ") = 0
str = Replace(LCase(str), " group by ", vbCrLf & "group by ")
Loop
OrderBy:
Do Until InStr(LCase(str), " order by ") = 0
str = Replace(LCase(str), " order by ", vbCrLf & "order by ")
Loop
FormatSQL = str
End Function
我要做的最后一件事就是应对:
从表中选择column1,column2,column3,column4;
我希望它是:
选择column1,
列2,
栏3,
column4
来自表格;
我正在努力使用逗号,因为这些可能会留下空格,或者它们可能直接进入下一个字母数字值。我也意识到会有一些像','
和","
这样的实例,我不想插入换行符。
这几乎就像我的instr必须是", {anyalphanumeric}"
或",{anyalphanumeric}"
,但我正在努力实现这一目标。
将非常感谢任何想法/建议。
答案 0 :(得分:0)
我的解决方案是创建此功能:
Function bIsAlphaNumeric(str As String) As Boolean
If (Asc(LCase(str)) >= 97 And Asc(LCase(str)) <= 122) Or IsNumeric(str) Then
bIsAlphaNumeric = True
Else
bIsAlphaNumeric = False
End If
End Function
我的主要功能现在是:
Function FormatSQL(str As String) As String
Dim x As Double, y As Double
Commas:
y = Len(str)
For x = 1 To y
If Mid(str, x, 1) = "," Then
y = x
If Mid(str, x + 1, 1) = " " Then
'Look at x+2
If bIsAlphaNumeric(Mid(str, x + 2, 1)) Then
'Convert x+1 to linebreak
str = Left(str, x) & vbCrLf & Mid(str, x + 2)
End If
Else
'Look at x+1
If bIsAlphaNumeric(Mid(str, x + 1, 1)) Then
'Convert x+1 to linebreak
str = Left(str, x) & vbCrLf & Mid(str, x + 1)
y = y + 1
End If
End If
End If
Next x
SSelect:
Do Until InStr(LCase(str), " select ") = 0
str = Replace(LCase(str), " select ", vbCrLf & "select ")
Loop
BSelect:
Do Until InStr(LCase(str), "(select ") = 0
str = Replace(LCase(str), "(select ", "(" & vbCrLf & "select ")
Loop
From:
Do Until InStr(LCase(str), " from ") = 0
str = Replace(LCase(str), " from ", vbCrLf & "from ")
Loop
Where:
Do Until InStr(LCase(str), " where ") = 0
str = Replace(LCase(str), " where ", vbCrLf & "where ")
Loop
Having:
Do Until InStr(LCase(str), " having ") = 0
str = Replace(LCase(str), " having ", vbCrLf & "having ")
Loop
GroupBy:
Do Until InStr(LCase(str), " group by ") = 0
str = Replace(LCase(str), " group by ", vbCrLf & "group by ")
Loop
OrderBy:
Do Until InStr(LCase(str), " order by ") = 0
str = Replace(LCase(str), " order by ", vbCrLf & "order by ")
Loop
aand:
Do Until InStr(LCase(str), " and ") = 0
str = Replace(LCase(str), " and ", vbCrLf & "and ")
Loop
oor:
Do Until InStr(LCase(str), " or ") = 0
str = Replace(LCase(str), " or ", vbCrLf & "or ")
Loop
FormatSQL = str
End Function