如题,例如有一条比较复杂的UPDATE 的 Sql语句UPDATE 表1
SET
表1.列1=(SELECT 列1 FROM 表2.主键1=表1.主键1),
表1.列2=(SELECT 列2 FROM 表2.主键1=表1.主键1)WHERE '------取得这个位置
EXISTS (SELECT 1 FROM 表2 WHERE 表2.主键1=表1.主键1)上面这条SQL语句,有时可能更为复杂,那么如何取得是个 WHERE 的位置
以便对这串语句进行解析。
SET
表1.列1=(SELECT 列1 FROM 表2.主键1=表1.主键1),
表1.列2=(SELECT 列2 FROM 表2.主键1=表1.主键1)WHERE '------取得这个位置
EXISTS (SELECT 1 FROM 表2 WHERE 表2.主键1=表1.主键1)上面这条SQL语句,有时可能更为复杂,那么如何取得是个 WHERE 的位置
以便对这串语句进行解析。
解决方案 »
- 用VB如何实现自动读取DVD光驱文件并播放?
- @_@,用BASIC做全局钩子的问题
- 求助:在vb6中如何使用图表?
- vb怎么接受由asp文件发送来的数据?
- 数据库备份?
- 请问FSO对象为什么不能正确得出大于2G的驱动器容量
- 关于CrystalReports的问题,很有趣,请各位高手看一看
- 关于视图的问题
- ActiveX dll 的高级应用!!! 苦恼苦恼!! 各位帮帮忙,看一下!!
- 打印图表的问题??
- [请教]两个listbox之间的数据交换,但是出现了错误。
- 不显示删除回复显示所有回复显示星级回复显示得分回复 请问我用ffshow解码1280*720的视频怎么出来的是1536*720的呀?[
在知网上有几篇论文.
这个还很难,因为有时有
引号的问题
SET
表1.列1='WHERE'
WHERE '------取得这个位置
EXISTS (SELECT 1 FROM 表2 WHERE 表2.主键1=表1.主键1)这种时间 WHERE就更难找了
SET
表1.列1='WHERE'
表2.列2=(SELECT 列A from 表2 where 表2.主键1=表1.主键1)
WHERE '------取得这个位置
EXISTS (SELECT 1 FROM 表2 WHERE 表2.主键1=表1.主键1)这句话很比较难提取了
另外 还有一个问题就是
如何, 判断 UPDATE前后的数据发生了哪些变更
有时甚至于主键都变了我现在是想通过UPDATE语句,取得这个操作后的日志
比如某个字段被改掉了.
Option ExplicitPrivate Sub Form_Load()
Dim s As String, tmps As String
s = "UPDATE 表1" & vbCrLf & _
"SET" & vbCrLf & _
" 表1.列1='WHERE'" & vbCrLf & _
" 表2.列2=(SELECT 列A from 表2 where 表2.主键1=表1.主键1)" & vbCrLf & _
"Where " & vbCrLf & _
" EXISTS (SELECT 1 FROM 表2 WHERE 表2.主键1=表1.主键1)"
Debug.Print InStr(s, "Where")
Do While InStr(s, "(") <> 0 And InStr(s, ")") <> 0
tmps = CutString(1, s, "(", ")", True, True)
s = Replace(s, tmps, Space(Len(tmps)))
Loop
Do While InStr(s, "'") <> 0 And InStr(s, "'") <> 0
tmps = CutString(1, s, "'", "'", True, True)
s = Replace(s, tmps, Space(Len(tmps)))
Loop
Do While InStr(s, """") <> 0
tmps = CutString(1, s, """", """", True, True)
s = Replace(s, tmps, Space(Len(tmps)))
Loop
Debug.Print s
Debug.Print "where位于第"; InStr(s, "Where") & "个字符"
End Sub
'文本截取函数,参数:起始位置,输入字符串,左标记,右标记,保留左标记,保留右标记
Public Function CutString(StartNum As Long, InPutString As String, LeftString As String, RightString As String, CutL As Boolean, CutR As Boolean)
On Error Resume Next
Dim StrLine As Long, StrLine2 As Long, Cl As Byte, Cr As Byte
If CutR Then Cr = Len(RightString)
If CutL Then Cl = Len(LeftString)
StrLine = InStr(StartNum, InPutString, LeftString) + Len(LeftString)
StrLine2 = InStr(StrLine, InPutString, RightString)
CutString = Mid(InPutString, StrLine - Cl, StrLine2 - StrLine + Cl + Cr)
End Function
-------
列1 列2
11 22
11 33
22 44
22 55
-------
执行了一条语句
UPDATE 表A T SET T.列2=T.列2+10 WHERE T.列1=11
那么 表就变成了
-------
列1 列2
11 32
11 43
22 44
22 55
-------结果 11这条的值发生变化了
那么我就可以写入日志
表A 主键是11的 列2的22 变成32
表A 主键是11的 列2的42 变成43大概是这个意思
A)看目的
数据更新的发起者,那里明确知道要更改什么以及更改的范围是什么。
B)看最终结果
用数据库的触发器,触发时直接有新旧两条记录可查看。而不是自己做 SQL 的语法分析。
比如 SqlServer迁入 Oracle
Dim strData As String
Dim reg As Object
Dim matchs As Object, match As Object strData = "UPDATE 表1" & vbCrLf & _
"SET" & vbCrLf & _
" 表1.列1='WHERE'" & vbCrLf & _
" 表2.列2=(SELECT 列A from 表2 where 表2.主键1=表1.主键1)" & vbCrLf & _
"WHERE '------取得这个位置" & vbCrLf & _
" EXISTS (SELECT 1 FROM 表2 WHERE 表2.主键1=表1.主键1)" Set reg = CreateObject("vbscript.regExp")
reg.Global = True
reg.IgnoreCase = True
reg.MultiLine = True
reg.Pattern = "('.*?where.*?'|"".*?where.*?""|\(.*?where.*?\))"
Set matchs = reg.Execute(strData)
For Each match In matchs
strData = Replace(strData, match.SubMatches(0), Space(Len(match.SubMatches(0))))
Next
Debug.Print strData
Debug.Print "位置:" & InStr(LCase(strData), "where")
End Sub要按照你的方法处理日志的话貌似比较麻烦,不知道sqlserver有没有直接的处理办法,如果你仅仅是执行那个update语句的话是没法在程序里得到的。要么换成select查询出来然后再一条条update,同时记录下来。但是这样效率降低多了。