求助:SQLserver 多个job 传参调同一个SP, SP里有临时表,并在头尾做drop操作。 当两个job一前一后运行,先运行的那个会失败怎么避免

baidu_35341000 2016-06-17 11:10:53
我在SQL server里面有四个job 分别为ATP,UNC,UNE,UNA,它们都要调用到同一个srore procedure 名为SD_load,只是这个4个job调用的时候给SP传了不同的参数(参数分别为ATP,UNC,UNE,UNA)。

Sp是这样的,里面用到很多临时表,有些是局部的有些是全局的。但在一开始都有drop的操作来确保因为上一步失败或者server问题而留着的临时表全部清除。之后就是建临时表和导数据(这个过程比较复杂,临时表出现的次数超过100次)最后插入到目标表里。

现在问题来了,这样的话这四个job 必须得分开运行。假如在ATP还没完成的时候,UNC开始了,那UNC调用SP的时候第一步是drop 临时表,ATP就会因为找不到临时表而报错。

我能想到的解决方案是:
1. 从schedule方面,只有上一个完成了下一个才能开始
2. SP的一开始不drop 临时表。那对于全局临时表来说数据应该乱了吧
3. 对SP里面所有的临时表加传进来的参数作为后缀。。

由于业务原因1 不太好实现。2 也不安全。3我想实现起来会比较复杂,所有的query都要放在@SQL里面用EXEC 来执行,太麻烦了。

求助求助: 不知道各位大神有没有好的建议?谢谢!!
...全文
291 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2016-06-17
  • 打赏
  • 举报
回复
引用 6 楼 baidu_35341000 的回复:
谢谢回复! 是这样的,其实这四个job的业务逻辑完全一样,这就是我为什么把所有的逻辑放在同个SP里的原因。我们是从oracle里拿数据,然后经过复杂的逻辑导到SQL server的表里, 四个job 是处理四个不同的地区的数据,过程完全一样。不过不同地区的数据在Oracle里面ready的时间不一样,所以在SQL server 里建了四个job在不同时间跑。 你说的如果把代码完全分开的话,代码冗余是非常大的。
看描述应该不需要用到全局临时表, 请问使用全局临时表的目的是什么?
唐诗三百首 2016-06-17
  • 打赏
  • 举报
回复
局部临时表是session级的, 不互相影响, 可以忽略. 主要是全局临时表的互用问题, 请问使用全局临时表的目的是什么? 分2种情况: 1.如果其他进程不需要全局临时表的数据, 则将全局临时表改为局部临时表即可. 2.如果其他进程需要全局临时表的数据, 则存储过程中先判断##t1是否存在,不存在则建立,而不是不管存在不存在都先drop后再建.
baidu_35341000 2016-06-17
  • 打赏
  • 举报
回复
引用 4 楼 kingtiy 的回复:
建议不要用全局临时表. 如果需要表在不同的过程中使用,直接创建用户表. 另外,你说的这种试调用,也还是会有问题,最好是串行调用执行.如果业务有依赖关系的话. 要么,就把之前的关系断开,做成四个用户表.这样就不会相互十五的干扰了.
谢谢回复! 是这样的,其实这四个job的业务逻辑完全一样,这就是我为什么把所有的逻辑放在同个SP里的原因。我们是从oracle里拿数据,然后经过复杂的逻辑导到SQL server的表里, 四个job 是处理四个不同的地区的数据,过程完全一样。不过不同地区的数据在Oracle里面ready的时间不一样,所以在SQL server 里建了四个job在不同时间跑。 你说的如果把代码完全分开的话,代码冗余是非常大的。
baidu_35341000 2016-06-17
  • 打赏
  • 举报
回复
引用 2 楼 beck464771647 的回复:
#t1,会话级别。全局的话用实体表吧
谢谢朋友的回复 那全局的临时表 ##t1有影响吗? 我试过job是会失败的。 如果吧全局表变成实体表的话,前后也要drop的呀。不drop的话表一直都在,里面的数据也都在。
kingtiy 2016-06-17
  • 打赏
  • 举报
回复
建议不要用全局临时表. 如果需要表在不同的过程中使用,直接创建用户表. 另外,你说的这种试调用,也还是会有问题,最好是串行调用执行.如果业务有依赖关系的话. 要么,就把之前的关系断开,做成四个用户表.这样就不会相互十五的干扰了.
baidu_35341000 2016-06-17
  • 打赏
  • 举报
回复
谢谢朋友的回复 那全局的临时表 ##t1有影响吗? 我试过job是会失败的。
引用 1 楼 wmxcn2000 的回复:
没关系的,临时表是会话级的,多个 job 就是多个会话,互相没有影响的;
足球不是方的 2016-06-17
  • 打赏
  • 举报
回复
#t1,会话级别。全局的话用实体表吧
卖水果的net 2016-06-17
  • 打赏
  • 举报
回复
没关系的,临时表是会话级的,多个 job 就是多个会话,互相没有影响的;
唐诗三百首 2016-06-17
  • 打赏
  • 举报
回复
引用 11 楼 baidu_35341000 的回复:
之前是因为从oracle拿数据是用到了openquery, 然后又在一个while loop里面操作,我同事跟我说这里要用全局临时表,不知道openquery这个要去oracle里执行的query是有什么不同还是怎么样,我也没有深究就按他说的。照理说所有的query应该都是在同一个session里面实现的,本地临时表应该够了。。对吧?
是的, 本地临时表够用了,无需全局临时表.
baidu_35341000 2016-06-17
  • 打赏
  • 举报
回复
引用 8 楼 ap0405140 的回复:
[quote=引用 6 楼 baidu_35341000 的回复:] 谢谢回复! 是这样的,其实这四个job的业务逻辑完全一样,这就是我为什么把所有的逻辑放在同个SP里的原因。我们是从oracle里拿数据,然后经过复杂的逻辑导到SQL server的表里, 四个job 是处理四个不同的地区的数据,过程完全一样。不过不同地区的数据在Oracle里面ready的时间不一样,所以在SQL server 里建了四个job在不同时间跑。 你说的如果把代码完全分开的话,代码冗余是非常大的。
看描述应该不需要用到全局临时表, 请问使用全局临时表的目的是什么?[/quote] 之前是因为从oracle拿数据是用到了openquery, 然后又在一个while loop里面操作,我同事跟我说这里要用全局临时表,不知道openquery这个要去oracle里执行的query是有什么不同还是怎么样,我也没有深究就按他说的。照理说所有的query应该都是在同一个session里面实现的,本地临时表应该够了。。对吧?
baidu_35341000 2016-06-17
  • 打赏
  • 举报
回复
引用 9 楼 kingtiy 的回复:
[quote=引用 6 楼 baidu_35341000 的回复:] [quote=引用 4 楼 kingtiy 的回复:] 建议不要用全局临时表. 如果需要表在不同的过程中使用,直接创建用户表. 另外,你说的这种试调用,也还是会有问题,最好是串行调用执行.如果业务有依赖关系的话. 要么,就把之前的关系断开,做成四个用户表.这样就不会相互十五的干扰了.
谢谢回复! 是这样的,其实这四个job的业务逻辑完全一样,这就是我为什么把所有的逻辑放在同个SP里的原因。我们是从oracle里拿数据,然后经过复杂的逻辑导到SQL server的表里, 四个job 是处理四个不同的地区的数据,过程完全一样。不过不同地区的数据在Oracle里面ready的时间不一样,所以在SQL server 里建了四个job在不同时间跑。 你说的如果把代码完全分开的话,代码冗余是非常大的。[/quote] 那这个不需要全局临时表呢.四个job分别往同一个地方塞数据就是了.[/quote] 恩,你说的对。之前是因为从oracle拿数据是用到了openquery, 然后又在一个while loop里面操作,我同事跟我说这里要用全局临时表,不知道openquery这个要去oracle里执行的query是有什么不同还是怎么样,我也没有深究就按他说的。照理说所有的query应该都是在同一个session里面实现的,本地临时表就够了。。
kingtiy 2016-06-17
  • 打赏
  • 举报
回复
引用 6 楼 baidu_35341000 的回复:
[quote=引用 4 楼 kingtiy 的回复:] 建议不要用全局临时表. 如果需要表在不同的过程中使用,直接创建用户表. 另外,你说的这种试调用,也还是会有问题,最好是串行调用执行.如果业务有依赖关系的话. 要么,就把之前的关系断开,做成四个用户表.这样就不会相互十五的干扰了.
谢谢回复! 是这样的,其实这四个job的业务逻辑完全一样,这就是我为什么把所有的逻辑放在同个SP里的原因。我们是从oracle里拿数据,然后经过复杂的逻辑导到SQL server的表里, 四个job 是处理四个不同的地区的数据,过程完全一样。不过不同地区的数据在Oracle里面ready的时间不一样,所以在SQL server 里建了四个job在不同时间跑。 你说的如果把代码完全分开的话,代码冗余是非常大的。[/quote] 那这个不需要全局临时表呢.四个job分别往同一个地方塞数据就是了.

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧