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