直接SQL账表取数语句分析【分享】
金蝶云社区-云社区用户4u731234
云社区用户4u731234
37人赞赏了该文章 1.1万次浏览 未经作者许可,禁止转载编辑于2017年04月21日 15:30:01
summary-icon摘要由AI智能服务提供

本文讨论了直接SQL配置语句在账表开发中的应用及其运行原理。介绍了SQL语句在账表数据源中的配置和执行过程,包括通过SQL Server Profiler监控SQL语句的执行,展示了SQL语句如何在平台管理的临时表中插入和查询数据,并解释了这样做的优势。还通过实例说明了在直接SQL账表中配置复杂SQL语句(如创建临时表)时可能遇到的问题及解决方案,即通过转换为存储过程来避免语法错误和实现成功运行。

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

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

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

实际运行的效果:

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


对于监控到的语句我们按关键字“T_SEC_USER”搜索下
可以看到一串这样的sql语句,
[code]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[/code]

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

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

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

设置语句测试及设置都成功,但运行不成功。
实际例子:
我们有这样一串sql语句:
语句中我们自己创建一个表,向表中插入数据,获取数据,最后把表删掉,
[code]create table #temp(
field1 varchar(50))
insert into #temp select 'hola'
select * from #temp
drop table #temp[/code]配置界面如下,


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


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


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


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

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

对于我们新配置的报错脚本,
拼接的语句就为:
[code]select * from
(
create table #temp(
field1 varchar(50))
insert into #temp select 'hola'
select * from #temp
drop table #temp
) temp[/code]

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

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

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


创建存储过程sql脚本,
[code]create proc text_temp
as
create table #temp(
field1 varchar(50))
insert into #temp select 'hola'
select * from #temp
drop table #temp
[/code]
修改报表的SQL语句,测试及一路下一步设置完成,

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

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