全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2092 4
2021-11-25

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


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

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

二维码

扫码加我 拉你入群

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

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

全部回复
2021-11-25 21:11:52
简单的说,有进程打开了该数据集,因此你无法执行修改操作,关闭那个进程就可以了。
二维码

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

2021-11-28 14:00:08
请检查是否使用了异步的删除和访问操作,即执行删除的是一个进程,执行访问的是另一个进程?
如果必须这样操作,那么在两个进程各自执行之前都应增加条件分支,当判断数据集可用时才执行删除或访问操作。
要判断数据集是否可用,至少有open()函数和exist()函数可选。
二维码

扫码加我 拉你入群

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

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

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个星期了
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群