数据库 2016-10-20
有一张报表,是基于sql脚本查询出的数据,一直是手动修改日期等关键字来每个月进行查询,目前的需求是把它做成自动化,并在PowerBi上实时查询。
我把其中的日期做了一些自动化获取的处理,例如月初的获取,例如工作日的获取(上篇)等,在整个工作完成后,直接执行就能实时查询出最新的数据,效果很好,准备放在PowerBi上使用Sql语句来DirectQuery,结果报了错误信息,如下:
在网上查找了下,有人这样解释
简单来说,就是DirectQuery的查询,是通过子查询来实现的。
select * from ([你想执行的语句])
这样的话,Declare肯定是会报错的。
我做了同样的实验,在Excel中建立一个这样的查询,是完全没有问题的,我注意到在Excel中,并没有Import和DirectQuery的选项,我想了下,可能是在Excel中是通过手动点击刷新,做了一遍重新导入的动作,这方面没有深究,所以我打算通过Excel来获得数据,然后在把它放在Onedrive上,接着再用PowerBi来获取Onedrive上的Excel文件,PowerBi上支持把Excel解析成一个工作簿,也可以实现点击实时刷新的效果,这是我昨天做的实验,我甚至都要妥协,打算使用这种看起来只需要点击的"简单方式"来实现。
但是我仍然不甘心,在今天查询到原因后,我打算麻烦一点,把所有定义的@关键字,全部替换成赋值的Sql脚本,因为基本上这样的查询,都是在脚本里定义一个字段,去动态赋值而已,不像存储过程,值需要手动输入,所以这并不是什么难事。
如果你定义的字段不是通过系统函数,而是通过某张表来获取某个字段(例如上篇的工作日),其实也只是把 @字段 替换成 (select 字段 from xxx ...) 括号带上,这样放在外部的
select a,b,(select 字段 from xxx),c from xxxxx... 也是完全没有任何问题的。
这只是我个人的一点小经验而已,看起来很简单,但是确是在不甘心妥协后找到的另外一种解决方式,这是很有意义的事情。想想看,通过Onedrive来做中转和最初的只想实时查询,做到了初心,这是让人很有成就感的事情。
对于程序员来说,成就感很重要,不是吗?:)