superhasty
什么样的支点才能够翘起地球?
随笔 - 10, 文章 - 1, 评论 - 81, 引用 - 0
在修改数据的SQL语句中使用OUTPUT子句带来的好处
在多线程并发访问数据库时,OUTPUT字句往往能够帮你解决一些常见却有点棘手的问题。
简单的举一个例子。访问数据库的一个常见场景是,根据某种条件找到对应的一条记录,然后对其Update,再将Update后的记录内容读出来(有时还要读出来后再插入另外的表)。
如:
Declare
@Id
int
Select
Top
1
@Id
=
ID
From
MyTable
Where
Status
=
0
Update
MyTable Status
=
1
From
MyTable
Where
Id
=
@Id
(
INSERT
INTO
SecondTable)
Select
*
From
MyTable
Where
Id
=
@Id
就可以简单地合并为一句:
Update
top
(
1
) MyTable
Set
Status
=
1
OUTPUT INSERTED.
*
(
INTO
SecondTable)
FROM
MyTable
Where
Status
=
0
合并起来的好处并不仅仅是只执行一次那么简单。在多线程并发访问时,第一种写法还需要使用者很熟悉锁和事务、隔离级别等概念,否则很容易出现死锁、数据冲突等情况。而第二种,即使在SQL Server默认的Read Commited隔离级别,也很难有大的问题。你甚至还可以在一个句子中包含多个OUTPUT:
Update
top
(
1
) MyTable
Set
Status
=
1
OUTPUT INSERTED.
*
,
1
INTO
SecondTable
OUTPUT
1
,
2
,INSERTED.ID
FROM
MyTable
Where
Status
=
0
实在很方便。关于OUTPUT的具体用法,就不赘述了,请参阅SQL Server联机丛书。
--附记:这篇随笔实在太小太随手,呵呵,不幸阅读到的朋友见谅。我刚好看到一篇讲并发访问的Blog,所以写了这么一段。那个Blog在这儿:
数据库并发问题-美女程序员
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted on 2007-08-23 18:34
鸟儿飞过
阅读(764)
评论(2)
编辑
收藏
评论
871560
#1楼
回复
引用
大哥,OUTPUT能这样用吗?我查了下SQL Server联机丛书,没找到啊!
在 SQL2000 跑了下,行不通啊!
能否解释下下.先谢了.
2007-08-24 11:37
|
饶兴红[未注册用户]
#2楼
回复
引用
查看
我是很少这样来用的,呵呵
2007-08-27 16:32
|
跨越
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
苹果第三名创始人:当年离开苹果因前景不明
·
报告称Android广告印象份额同比增长504%
·
百度高管称正调研东南亚市场 未来或建分公司
·
东芝索尼获得日本国有银行逾十亿美元贷款
·
Getjar发布Android虚拟支付系统
»
更多新闻...
最新知识库文章
:
·
编程的艺术:漂亮的代码和漂亮的软件
·
GIT分支管理是一门艺术
·
编程:是一门艺术
·
编程是一门艺术吗?
·
对Java初学者的忠告
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
导航
博客园
首页
新随笔
联系
订阅
管理
<
2012年2月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1
2
3
4
5
6
7
8
9
10
公告
关注方向:软件设计技术在开发中的应用、企业级软件研发
我的MSN:superhasty
昵称:
鸟儿飞过
园龄:
7年6个月
粉丝:
1
关注:
0
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
随笔分类
Pattern(1)
(rss)
SQL Server2005(5)
(rss)
SQL Server基础知识(1)
(rss)
VS2005(2)
(rss)
随笔档案
2008年1月 (1)
2007年8月 (3)
2007年7月 (1)
2006年9月 (1)
2005年11月 (3)
2005年6月 (1)
2004年12月 (1)
文章分类
SQL Server 2005(1)
(rss)
最新评论
阅读排行榜
评论排行榜
推荐排行榜