楼主: jason_udu
2174 4

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

  • 1关注
  • 1粉丝

已卖:393份资源

硕士生

16%

还不是VIP/贵宾

-

威望
0
论坛币
672 个
通用积分
9.4462
学术水平
5 点
热心指数
5 点
信用等级
5 点
经验
2717 点
帖子
57
精华
0
在线时间
153 小时
注册时间
2007-3-26
最后登录
2025-10-8

楼主
jason_udu 发表于 2021-11-25 11:08:23 |AI写论文

+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
拉您进交流群
GMT+8, 2026-1-24 20:00