SQL语句相关的非常难的问题,请各位帮帮忙
假设我动态生成一个SQL查询语句,甚至可以是一个存储过程,如果可以,两者都考虑,否则只考虑是查询语句的情况我想知道有什么办法可以知道这个语句或存储过程执行后生成的结果集从...
假设我动态生成一个SQL查询语句,甚至可以是一个存储过程,如果可以,两者都考虑,否则只考虑是查询语句的情况
我想知道有什么办法可以知道这个语句或存储过程执行后生成的结果集从哪些源表中来的
注:我的SQL语句是动态组织的,所以,里面有哪些表是不确定的,请不要告诉我,在组织时就知道是哪些表了,只假设我就有一个已完成的SQL语句,想知道查了哪些源表
对了,我用的是ADO.NET 展开
我想知道有什么办法可以知道这个语句或存储过程执行后生成的结果集从哪些源表中来的
注:我的SQL语句是动态组织的,所以,里面有哪些表是不确定的,请不要告诉我,在组织时就知道是哪些表了,只假设我就有一个已完成的SQL语句,想知道查了哪些源表
对了,我用的是ADO.NET 展开
2个回答
展开全部
这个问题不太好解决,大致可以循两个方向去解决:
1)需要数据库支持。看看数据库有没有储存运行SQL查询记录的机制,或者自建机制将数据库每次运行查询过的源表名存储起来(操作查询比较容易,可以使用触发器,选择查询不好办)。如果有这类记录的话,那么查询这些记录就可以得到查询过哪些源表?;
2)用编程的方法,对已经运行的SQL语句进行分析,根据SQL语言的编写规律,编写相应的算法,从中检索出这些字符串中查询过的源表名,具体的算法代码视不同编程语言和数据库SQL方言而有所不同。大致上是找关键字 “From” 或“UPDATE”或“DELETE”后面到关键字“WHERE”或“GROUP'或“ORDER”或结尾之间,首个无空格的字符串、或逗号后面无空格的字符串、或[]方括号里的字符串等
例如:SQL查询字符串“select a.*, b.name,c.Qty from table1 a, [table 2] b,(select item,Sum(*) as Qty from table3 group by item) c where a.id=b.id and a.item =c.item"
用算法取出里面的 table1、table 2、table3,当然取出来的表名还要排除其中的虚拟表(如果存在的话,例如查询、视图、存储过程、临时表等) 。
只要算法合适取出来源表名完全是能做的到得,只不过设计这个算法绝对不是一件轻松事,需要对SQL查询有很深入细致的了解!
哦!对了,如果数据库的所有源表名都带一个可唯一标识的“字符串”前缀或者后缀,那么取源表名算法可能会大大简化。
1)需要数据库支持。看看数据库有没有储存运行SQL查询记录的机制,或者自建机制将数据库每次运行查询过的源表名存储起来(操作查询比较容易,可以使用触发器,选择查询不好办)。如果有这类记录的话,那么查询这些记录就可以得到查询过哪些源表?;
2)用编程的方法,对已经运行的SQL语句进行分析,根据SQL语言的编写规律,编写相应的算法,从中检索出这些字符串中查询过的源表名,具体的算法代码视不同编程语言和数据库SQL方言而有所不同。大致上是找关键字 “From” 或“UPDATE”或“DELETE”后面到关键字“WHERE”或“GROUP'或“ORDER”或结尾之间,首个无空格的字符串、或逗号后面无空格的字符串、或[]方括号里的字符串等
例如:SQL查询字符串“select a.*, b.name,c.Qty from table1 a, [table 2] b,(select item,Sum(*) as Qty from table3 group by item) c where a.id=b.id and a.item =c.item"
用算法取出里面的 table1、table 2、table3,当然取出来的表名还要排除其中的虚拟表(如果存在的话,例如查询、视图、存储过程、临时表等) 。
只要算法合适取出来源表名完全是能做的到得,只不过设计这个算法绝对不是一件轻松事,需要对SQL查询有很深入细致的了解!
哦!对了,如果数据库的所有源表名都带一个可唯一标识的“字符串”前缀或者后缀,那么取源表名算法可能会大大简化。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询