Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

如何从SQL语句中提取出我想要的表名

小魏  发表于:2009-11-23 18:09:13  
复制

大家好,我想从SQL语句中提取出表名?请问如何做到?

我目前用的方法是关键词查找法,但是,SQL语句的关键词太多,同时,关键词的位置有时会不同.这样就会无法提取出我想要的表的名称来.

我目前的方法提取的成功率是60%左右.仅限简单的查询.复杂一些的基本上都是错的.我把代码也贴出来.让大家一起帮我想想办法.

先感谢所有关注这个帖的朋友.

 

'==============================================================
Public Function tableNameInSQL(StrSQL As String) As String    '从SQL语句中提取出表的名称
Dim intA As Integer
Dim intB As Integer
If sCount(StrSQL, "WHERE") = 1 Then
 intA = InStr(1, StrSQL, "from", vbTextCompare)
 intB = InStr(1, StrSQL, "where", vbTextCompare)
 tableNameInSQL = Trim(Mid(StrSQL, intA + 4, intB - intA - 4))
Else
'And sCount(strSQL, "GROUP BY") = 0 And sCount(strSQL, "HAVING") = 0 And sCount(strSQL, "ORDER BY")
 If sCount(StrSQL, "WHERE") = 0 And sCount(StrSQL, "ORDER BY") = 0 Then
    intA = InStr(1, StrSQL, "from", vbTextCompare)
    intB = InStr(1, StrSQL, ";", vbTextCompare)
    tableNameInSQL = Trim(Mid(StrSQL, intA + 4, intB - intA - 4))
 End If
 If sCount(StrSQL, "WHERE") = 0 And sCount(StrSQL, "ORDER BY") = 1 Then
    intA = InStr(1, StrSQL, "from", vbTextCompare)
    intB = InStr(1, StrSQL, "ORDER BY", vbTextCompare)
    tableNameInSQL = Trim(Mid(StrSQL, intA + 4, intB - intA - 4))
 End If
End If
If sCount(tableNameInSQL, ",") > 0 Then
    tableNameInSQL = Trim(Mid(tableNameInSQL, 1, InStr(1, tableNameInSQL, ",", vbTextCompare) - 1))
End If
If sCount(tableNameInSQL, "JOIN ") > 0 And sCount(tableNameInSQL, " ON ") > 0 Then
    StrSQL = tableNameInSQL
    intA = InStr(1, StrSQL, "JOIN ", vbTextCompare)
    intB = InStr(1, StrSQL, " ON ", vbTextCompare)
    tableNameInSQL = Trim(Mid(StrSQL, intA + 4, intB - intA - 4))
End If
Debug.Print tableNameInSQL
If sCount(tableNameInSQL, " JOIN ") > 0 Then
    tableNameInSQL = Mid(tableNameInSQL, InStr(1, tableNameInSQL, " JOIN ", vbTextCompare) - 1, Len(tableNameInSQL) - (InStr(1, tableNameInSQL, " JOIN ", vbTextCompare) - 1))
End If
Debug.Print tableNameInSQL
If sCount(tableNameInSQL, " JOIN ") > 0 Then
    tableNameInSQL = Mid(tableNameInSQL, InStr(1, tableNameInSQL, " JOIN ", vbTextCompare) - 1, Len(tableNameInSQL) - (InStr(1, tableNameInSQL, " JOIN ", vbTextCompare) - 1))
End If
End Function

 

Public Function sCount(String1 As String, String2 As String) As Integer
'取得一个字符串在另外一个字符串中出现的次数
'?sCount("01.01.01",".")
'2
    Dim i As Integer, iCount As Integer
    i = 1
    Do
           If (i > Len(String1)) Then Exit Do
           i = InStr(i, String1, String2, vbTextCompare)
           If i Then
              iCount = iCount + 1
              i = i + 2
              DoEvents
           End If
    Loop While i
    sCount = iCount
End Function

 

 

以下是我的SQL语句.

SELECT SCM_采购单清单表.采购清单代码, SCM_采购单清单表.采购主单代码, SCM_采购单清单表.物料代码, SCM_采购单清单表.物料名称, SCM_采购单清单表.规格型号, SCM_采购单清单表.辅助属性, SCM_采购单清单表.单位, SCM_采购单清单表.数量, NZ([数量之总计],0) AS 收料通知数量总计, [数量]-NZ([数量之总计],0) AS 收料通知差数, SCM_外购材料入库单总计.实收数量之总计, [数量]-NZ([实收数量之总计],0) AS 差数, SCM_采购单清单表.辅助单位, SCM_采购单清单表.辅助数量, SCM_采购单清单表.交货日期, SCM_采购单清单表.备注, SCM_采购单清单表.已处理, SCM_采购单清单表.已完成, SCM_采购单清单表.已关闭, SCM_采购单清单表.采购类型, SCM_采购单清单表.PO_ID FROM SCM_收料通知单总计查询 RIGHT JOIN (SCM_外购材料入库单总计 RIGHT JOIN SCM_采购单清单表 ON SCM_外购材料入库单总计.采购单号 = SCM_采购单清单表.采购清单代码) ON SCM_收料通知单总计查询.采购单号 = SCM_采购单清单表.采购清单代码 WHERE ((([数量]-NZ([数量之总计],0))>0) AND (([数量]-NZ([实收数量之总计],0))>0) AND ((SCM_采购单清单表.已关闭)=0));
(SCM_外购材料入库单总计 RIGHT JOIN SCM_采购单清单表

提取出来的结果是,

"T JOIN SCM_采购单清单"

而我想要的是:

"SCM_采购单清单"

 

Top
小魏 发表于:2009-11-23 18:10:30

或者是有没有其它的什么办法,直接可以读出表名的方法?



小魏 发表于:2009-11-24 21:20:38
没人关注呀,只能自己关注.呵呵

andymark 发表于:2009-11-25 13:29:29

看到一大堆代码就想晕

 

还是传示例吧(只要待解决的内容相关就OK啦)

 

 

 



总记录:3篇  页次:1/1 9 1 :