直接SQL账表取数语句分析【分享】
金蝶云社区-天冥异
天冥异
16人赞赏了该文章 3694次浏览 未经作者许可,禁止转载编辑于2018年07月27日 11:23:46

写本帖子的目的,有直接SQL配置的语句问题,能够参看本帖子自行分析解决。

对于账表的开发,直接sql账表相对来说是比较容易的,
可以直接写sql语句,实现数据的统计分析。
其实不仅是直接sql账表,包括简单账表、分页账表、树形账表、透视表 取数过程都是一致的。

下面就以简单的直接sql账表的语句来做分析
如下图:
在直接sql账表数据源,我们写了一个用户名称的查询,


实际运行的效果:


那么对于我们设置的语句,直接sql账表取数是如何用的呢?
对于SQL Server 数据库,我们可以通过 SQL Server Profiler进行监控看下,
我们打开SQL Server Profiler,
点击账表“刷新”菜单,
可以看到监控到的数据库执行的语句,

对于监控到的语句我们按关键字“T_SEC_USER”搜索下
可以看到一串这样的sql语句,

  1. Select B.*,ROW_NUMBER() OVER(ORDER BY FIDENTITYID_SEQ) FIDENTITYID INTO TMP76E324C8265D11E7A2B878ACC1A FROM (Select A.*,1 FIDENTITYID_SEQ FROM (select FNAME from T_SEC_USER) A) B

复制代码



语句中的 select FNAME from T_SEC_USER 也就是我们在直接sql 账表配置界面编写的脚本,
直接sql账表在运行时外面多加了一层取数的调用,主要目的是向一个受到平台管理的临时表插入数据,
其中的“TMP76E324C8265D11E7A2B878ACC1A”就是平台管理的临时表,
语句大体 就是 select * into 平台管理的临时表 from (配置的sql脚本) temp,

这里也许有人会问,为什么要加入到一个平台关联的临时表,好处是什么?
好处就是平台会对生成的临时表,可以做到及时清理,
账表界面的展现的,需要数据中有对应的表进行存储,
而账表的取数查询也就是当时界面打开取数查看下,
对应的数据表里面就可以不需要了,
使用平台管理的临时表,就可做的及时清理掉。

知道上述的直接sql账表语句运行的原理后,我们也就对于一些情况可以做自行分析下,

设置语句测试及设置都成功,但运行不成功。
实际例子:
我们有这样一串sql语句:
语句中我们自己创建一个表,向表中插入数据,获取数据,最后把表删掉,

  1. create table #temp(

  2. field1 varchar(50))

  3. insert into #temp select 'hola'

  4. select * from #temp

  5. drop table #temp

复制代码

配置界面如下,
 
其实这串语句进行测试及在直接sql账表数据源向导一步步是可以设置成功的。
点“测试”可以测试成功,

点“下一步”,也是可以正常到下一步,最终可以设置完成,

我们把下一步都走完,最终完成,看下实际的运行效果吧,

我们把“简要信息”展开,看到了实际的取数语句,


也就是我们前面说的,select * into 平台管理的临时表 from (配置的sql脚本) temp
分析语法,对于写的sql脚本,能否运行时成功取数
我们是可以把语句精简为如下
select * from 
(
我们配置的sql脚本
) temp

对于我们新配置的报错脚本,
拼接的语句就为:

  1. select * from

  2. (

  3. create table #temp(

  4. field1 varchar(50))

  5. insert into #temp select 'hola'

  6. select * from #temp

  7. drop table #temp

  8. ) temp

复制代码



我们直接把语句写的SQL Server中看下,报错了,是不合法的。




那么我就有这样的需求该怎么办呢?
好办 SQL语句界面是支持存储过程的,
既然直接写SQL语句通不过,
我们就改成为存储过程试下看,


数据库中把前面的脚本创建存储过程,

创建存储过程sql脚本,

  1. create proc text_temp

  2. as

  3. create table #temp(

  4. field1 varchar(50))

  5. insert into #temp select 'hola'

  6. select * from #temp

  7. drop table #temp


复制代码


修改报表的SQL语句,测试及一路下一步设置完成,


改造为存储过程后我们来看下效果,
报表运行正常了,
通过监控工具我们也可以看到,实际是直接调用设置的存储过程。


至此,目的相信已经达到了,后面再有直接SQL配置的语句问题,就可以自行解决了。
完。


赞 16