找回密码
 立即注册

QQ登录

只需一步,快速开始

Eden.Sun Wyn认证

超级版主

99

主题

2505

帖子

4864

积分

超级版主

Rank: 8Rank: 8

积分
4864

Wyn高级认证Wyn认证

Eden.Sun Wyn认证
超级版主   /  发表于:2023-6-7 18:12  /   查看:818  /  回复:0
本帖最后由 Eden.Sun 于 2023-6-7 18:12 编辑

  最近遇到这样的一种使用场景,需要再数据集查询数据之前先调用数据库的存储过程,来刷新数据库的表数据,然后数据集再去查询数据库数据。因为我们报表在请求发送数据集数据请求的顺序是随机的,所以如果直接将执行存储过程的语句创建数据集的话,无法保证存储过程的执行顺序,所以我们需要换一个思路,绕一下。
  我们知道,如果某个数据集A使用的参数来自于数据集B,那么A数据集会等待B数据集加载完成之后,从B数据集获取数据,然后查询自己本身的数据。那么我们就可以通过这种机制,将存储过程执行的返回结果,绑定到参数,然后将参数绑定到其他数据集上,但是不使用,这样就能保证存储过程的绝对优先执行。
  
  首先我们在数据库创建存储过程:
  1. ALTER PROC sp_proc1

  2. as
  3.         UPDATE [dbo].[test_sql] SET [descs] = [descs] +'1' WHERE [id] = 1
  4.         
  5. BEGIN        
  6.         select * from test_sql;
  7. END
复制代码
  这个存储过程的意思是,每次执行都对id=1的数据,的descs字段内容追加字符串1。如起始内容为 a,执行一次后的结果为 a1,两次为a11......
  
  


  然后数据源(不做赘述。sqlserver创建数据源,可以参考我们的帮助文档:创建SqlServer数据源


  然后创建数据集,这个数据集用来执行我们的存储过程:
  

  然后创建第二个数据集:

  先创建参数,一定要注意,这个参数的参数值必须来源于存储过程的数据集:
  

  然后添加数据集的查询语句:
  1. select * from test_sql where 1=1 or  id = @Parameter1
复制代码
  
  

  然后我们测试一下:我们存储过程的数据集是DataSet1,正常数据的查询时DataSet2,如果我们的数据是存储过程执行之后查的,那下图的两张表格的数据是完全相同的;反之,则两张表的数据的 descs 列的数据,肯定会不一样:
  



  预览:
  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部