楼主: jason_udu
1604 4

[SAS EM] ERROR: 锁对“DATA2.WEIGHT.DATA”不可用。 [推广有奖]

  • 1关注
  • 1粉丝

硕士生

12%

还不是VIP/贵宾

-

威望
0
论坛币
673 个
通用积分
9.5962
学术水平
5 点
热心指数
5 点
信用等级
5 点
经验
2714 点
帖子
56
精华
0
在线时间
150 小时
注册时间
2007-3-26
最后登录
2024-3-16

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

    proc sql;
        delete from data2.weight
    where varietyid="I06114";
        quit;


执行这个语句,时不时报这个错误,实在找不出什么原因,求助各位大神

这里的data2是本地的一个文件路径[D:\data2]下,不是数据库

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Weight weigh Eight Error Data

沙发
whymath 发表于 2021-11-25 21:11:52 |只看作者 |坛友微信交流群
简单的说,有进程打开了该数据集,因此你无法执行修改操作,关闭那个进程就可以了。

使用道具

藤椅
jason_udu 发表于 2021-11-26 09:13:58 |只看作者 |坛友微信交流群
whymath 发表于 2021-11-25 21:11
简单的说,有进程打开了该数据集,因此你无法执行修改操作,关闭那个进程就可以了。
       嗯,琢磨了一下,就是当前线程打开的表。因为表比较大,delete需要花时间,再次操作该表时,之前的delte还在执行操作,没有结束。从而造成表被锁的报错。
       现在的问题是SAS有没有返回delete语句操作结束的功能或者参数?

使用道具

板凳
whymath 发表于 2021-11-28 14:00:08 |只看作者 |坛友微信交流群
请检查是否使用了异步的删除和访问操作,即执行删除的是一个进程,执行访问的是另一个进程?
如果必须这样操作,那么在两个进程各自执行之前都应增加条件分支,当判断数据集可用时才执行删除或访问操作。
要判断数据集是否可用,至少有open()函数和exist()函数可选。

使用道具

报纸
jason_udu 发表于 2021-11-29 18:12:14 |只看作者 |坛友微信交流群
whymath 发表于 2021-11-28 14:00
请检查是否使用了异步的删除和访问操作,即执行删除的是一个进程,执行访问的是另一个进程?
如果必须这样 ...
不存在异步的问题,执行的代码就是下面这两段,删除原表中的重复记录,然后append新记录
        proc sql;
        delete from &inSet.
            where varietyid  in  (select distinct varietyid from &addSet.);
                   
        proc append base=&inSet. data=&addSet. force;run;       
当inset表很大时,就会触发这个锁对“”不可用  的错误


关于这个open,我写了下面这个宏,但open正确,表还是被锁住,也不知道哪里出问题
理论上open能够操作,执行append应该就没有问题了

%macro DataSetLock(ds=,sleepSecond=3,tryNumLmt=10);
*open返回正确,但表还是会锁定报错;
        data _null_;
        dsid = 0;
                tryNum=0;
        do until (dsid gt 0 or tryNum>&tryNumLmt.);
          dsid = open("&ds.");
          if (dsid eq 0) then do;
            rc = sleep(&sleepSecond.);
          end;
                  tryNum=tryNum+1;
        end;
        if (dsid gt 0) then do;
                   put dsid   tryNum;
          rc = close(dsid);
        end;
      run;
%mend;

麻烦帮忙看看,能不能找到解决方案,真是头大,耽搁2个星期了

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 19:30