如何从一个SQL中找出所用到的所有表名? ( 积分: 100 )

  • 主题发起人 主题发起人 kingbenz
  • 开始时间 开始时间
K

kingbenz

Unregistered / Unconfirmed
GUEST, unregistred user!
说明:各表使用join来联接。
 
SELECT&nbsp;NAME<br>FROM&nbsp;sysobjects&nbsp;where&nbsp;parent_obj=0&nbsp;and&nbsp;xtype='U'
 
SELECT&nbsp;NAME<br>FROM&nbsp;sysobjects&nbsp;where&nbsp;parent_obj=0&nbsp;and&nbsp;xtype='U'
 
这个没什么好办法,只有分析语句,找出来吧。
 
var&nbsp;<br>&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;Integer;&nbsp;<br>begin&nbsp;<br>&nbsp;&nbsp;for&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;:=&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;ADODataSet1.Fields.Count&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;do&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;mem.Lines.Add(vartostr(ADODataSet1.Recordset.Fields.Properties.Item['BASETABLENAME'].Value));&nbsp;<br>end;
 
通过系统表,来找到
 
SELECT&nbsp;NAME<br>FROM&nbsp;sysobjects&nbsp;where&nbsp;parent_obj=0&nbsp;and&nbsp;xtype='U'<br>哈哈:以上语句把所有表名都列出来了,包含了可能楼主说的没用到的表名,不符合要求<br>要找出所用到的表名,就在用的时候把它抄下来
 
加个条件再查一下.
 
找到&nbsp;‘&nbsp;FROM&nbsp;’特征串<br>再找后面的字符,直到为空格止,即得主表表名。&nbsp;<br><br>再处理JONIN&nbsp;表<br>找到‘&nbsp;JOIN&nbsp;’特征串<br>再找后面的字符,直到为空格止,即得JONIN表表名。&nbsp;<br><br>还要注意子查询里的表名,当然自己写的脚本这个就好控制了。
 
我的意思是指把一个SQL语句中用到的所有表找出来,并不是把数据库中的所有表找出来,像黄耀彰的理解是正确的,还有没有更好的方法?
 
我有个笨办法,把sql语句from之后where之前的按空格做字符串分割,然后逐个查询数据库看是不是表名
 
SELECT&nbsp;NAME<br>FROM&nbsp;sysobjects&nbsp;where&nbsp;parent_obj=0&nbsp;and&nbsp;xtype='U'&nbsp;and&nbsp;CharIndex(Name,'SQL语句')&nbsp;&gt;&nbsp;0
 
呵呵,原来前面的语文做不及格。<br><br>为什么我能理解?<br>因为我做过类似的东西,就是动态生成查询脚本,我不仅要找表名,还要识别“别名”
 
procedure&nbsp;TForm1.btn1Click(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;i:&nbsp;integer;<br>&nbsp;&nbsp;s:&nbsp;string;<br>begin<br>&nbsp;&nbsp;qry1.Close&nbsp;;<br>&nbsp;&nbsp;qry1.SQL.Text&nbsp;:=&nbsp;'SELECT&nbsp;aa.*,bb.*&nbsp;from&nbsp;aa&nbsp;inner&nbsp;join&nbsp;bb&nbsp;on&nbsp;aa.a=bb.a';<br>&nbsp;&nbsp;qry1.Open&nbsp;;<br>&nbsp;&nbsp;mem1.Lines.Clear&nbsp;;<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;0&nbsp;to&nbsp;qry1.Fields.Count&nbsp;-&nbsp;1&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;:=&nbsp;qry1.Recordset.Fields.Properties.Item['BASETABLENAME'].Value;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;mem1.Lines.IndexOf(s)&nbsp;=&nbsp;-1&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem1.Lines.Add(s);<br>&nbsp;&nbsp;end;<br>end;
 
汗,原来ysai已经给出答案了。
 
后退
顶部