如题,例如有一条比较复杂的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 的位置
以便对这串语句进行解析。

解决方案 »

  1.   

    列你的的CREATE TABLE 语句和测试数据,上面没看懂。
      

  2.   

    SQL解析?
    在知网上有几篇论文.
      

  3.   

    个人觉得从后往前要好分析一点,括号里面的where不算【遇到")"时继续找"("】,取第一个符合条件的where
      

  4.   

    http://download.csdn.net/source/1644211
      

  5.   

    个人觉得从后往前要好分析一点,括号里面的where不算【遇到")"时继续找"("】,取第一个符合条件的where
    这个还很难,因为有时有 
    引号的问题
      

  6.   

    比如:UPDATE 表1
    SET
     表1.列1='WHERE'
    WHERE '------取得这个位置
      EXISTS (SELECT 1 FROM 表2 WHERE 表2.主键1=表1.主键1)这种时间 WHERE就更难找了
      

  7.   

    UPDATE 表1
    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语句,取得这个操作后的日志
    比如某个字段被改掉了.
      

  8.   

    去掉“(),‘’,"",{}”内的,再找where看符合要求不?
      

  9.   

    举例:
    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
      

  10.   

    我想那应该是另外一个问题。而且我对sql不熟悉,也不知道楼主的具体要求和怎么处理日志。
      

  11.   

    比如有一张 表A
    -------
    列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大概是这个意思
      

  12.   

    做数据日志的最佳切入点
    A)看目的
    数据更新的发起者,那里明确知道要更改什么以及更改的范围是什么。
    B)看最终结果
    用数据库的触发器,触发时直接有新旧两条记录可查看。而不是自己做 SQL 的语法分析。
      

  13.   

    而且如果数据迁移,立马报废
    比如 SqlServer迁入 Oracle
      

  14.   

    Private Sub Form_Load()
        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,同时记录下来。但是这样效率降低多了。