新手发问,关于SQL

codemon 2001-10-29 01:47:52
我通过一个SQL代理操作远程数据库,
SQL代理则通过ODBC工作,只允许标准SQL语句。
可以使用存储过程、游标。我想得到以下两个效果:

1〉独占某一个表,在一个进程对该表进行读写操作时禁止其他进程操作
2〉用一条语句查询并改变,如
查询某表中id=0的纪录,并将这些记录id改变为1,同时我还要得到这些记录。
update MyTable set id=1 where id in (select id from MyTable where id=0)虽然可实现前半部分可不能返回记录



...全文
210 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
codemon 2001-11-08
  • 打赏
  • 举报
回复
好久没上网了,不好14.

其实2、3、5都好解决,
关键是1和4,就是说进存储过程时锁表,出来时解锁。
hammer1025 2001-10-31
  • 打赏
  • 举报
回复
能把5放在2的后面吗,即检索后就返回结果,然后在set status=1 ,解锁。
wwl007 2001-10-31
  • 打赏
  • 举报
回复
update TableName with(holdlock) set status=0 where status=1
wwl007 2001-10-31
  • 打赏
  • 举报
回复
update tablename with (holdlock) set status=1 where status=0;
codemon 2001-10-31
  • 打赏
  • 举报
回复
呵呵,测试了n次,原来应该这样写:
select * from TableName holdlock
select * from TableName tablock

不过还是不太懂。
各位大虾能不能给俺一个简单一点的用于ODBC的SQL存储过程或其他方法的框架,
实现以下功能:

1.锁表A
2.从表A中检索status=0,x条
3.将(2)中的检索结果set status=1
4.解锁表A
5.返回(2)中的检索结果

先谢谢了!
zhuzhichao 2001-10-29
  • 打赏
  • 举报
回复
2.
假設你的主鍵叫Pkey varchar型的,那麼這麼做:

declare @v_Pkey varchar(4000)
declare @v_sql varchar(100)
set @v_Pkey = ''
update MyTable set id = 1,@v_Pkey = @v_Pkey+','''+Pkey+'''' where id = 0;
set @v_Pkey = '('+substring(@v_Pkey,2,len(@v_Pkey))+')'
set @v_sql = 'select * from MyTable where Pkey in '+@v_Pkey
exec (@v_sql)
codemon 2001-10-29
  • 打赏
  • 举报
回复
有主鍵
zhuzhichao 2001-10-29
  • 打赏
  • 举报
回复
1.
select * from TableName with (holdlock)

2.
你的表有沒有主鍵?
KingSunSha 2001-10-29
  • 打赏
  • 举报
回复
我不知道在SQL SERVER中怎么写, 在ORACLE中只要执行:LOCK TABLE MYTABLE IN EXCLUSIVE MODE;就行了.
建议查一下HELP, 应该不难找到的.
codemon 2001-10-29
  • 打赏
  • 举报
回复
呵呵,liu_nan(柳南)和KingSunSha(弱水三千)说得对,是可以用
update MyTable set id=1 where id=0 来完成,当初我那样写是想
可不可以得到子查询的结果

wwl007(疑难杂症)或其他哪位大虾可不可以给俺具体讲讲用事务实现独占,
with holdlock不支持。

KingSunSha 2001-10-29
  • 打赏
  • 举报
回复
哈哈,楼上的兄弟眼神真好.其实应该写成:
update MyTable set id=1 where id=0
liu_nan 2001-10-29
  • 打赏
  • 举报
回复
同意楼上兄的意见,另外补充一点,最好不要用in,用(+)来替换它,否则数据量大了,就等……???
update MyTable set id=1 where id in (select id from MyTable where id=0)好象着条语句也没必要用in吧?
KingSunSha 2001-10-29
  • 打赏
  • 举报
回复
对于问题2, 我想用一条SQL语句是无法完成的,不过完全可以通过存储过程来完成,先UPDATE然后SELECT.
wwl007 2001-10-29
  • 打赏
  • 举报
回复
oracle 里面可以在sql语法加for update!
sql server 可以在sql语法里面with holdlock
当然你也可以用事物完成!
第二个问题我感到不可能实现。
update和select 不能一块实现阿!
你可以先把这条纪录选出来
select 保存数据里面。
然后更新。

codemon 2001-10-29
  • 打赏
  • 举报
回复
等待中....

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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