如何在update执行之后,获取被更新的值?

hwxiao 2009-06-02 02:48:57
比如有表test1
id, int
name ,VARCHAR
banlance,int


我想在update banlance+10 where id=1的同时获得banlance的当前值。

我知道触发器里面可以获得,但是因为要操作其他的表,能不能不再触发器里面做啊
...全文
667 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxkid 2009-06-03
  • 打赏
  • 举报
回复
declare @banlance int;

update table1
set @banlance = banlance+10, banlance = @banlance
where id=1;

select @banlance;
Rotel-刘志东 2009-06-03
  • 打赏
  • 举报
回复
update test1  set banlance+10  where id=1
devilidea 2009-06-03
  • 打赏
  • 举报
回复
喵喵
hery2002 2009-06-02
  • 打赏
  • 举报
回复
1.通过变量操作,
2.通过反向操作计算原来的值,
比如通过balance =balance +10更新原表,然后通过 [原来的值]=balance - 10更新新表。
sunhuiyuncheng 2009-06-02
  • 打赏
  • 举报
回复
--先执行修改
update test1 set banlance=banlance+10 where id=1;
--再执行获得当前值
select banlance
from test1
where id=1
Tomzzu 2009-06-02
  • 打赏
  • 举报
回复
先用变量得到值, 再去更新, 最好取这个变量就行了
SQL脚本如下

begin tran aa
declare @dCur money --- 当前值
set @dCur = 0
select @dCur = banlance + 10 from test1

update test1 set
banlance= @dCur
where id=1
select @dCur
commit tran aa
ChinaJiaBing 2009-06-02
  • 打赏
  • 举报
回复

<OUTPUT_CLAUSE> ::=
{
[ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ]
[ OUTPUT <dml_select_list> ]
}
<dml_select_list> ::=
{ <column_name> | scalar_expression } [ [AS] column_alias_identifier ]
[ ,...n ]

<column_name> ::=
{ DELETED | INSERTED | from_table_name } . { * | column_name }
| $action


参数
@table_variable
指定一个 table 变量,返回的行将插入此变量,而不是返回给调用方。@ table_variable 必须在 INSERT、UPDATE、DELETE 或 MERGE 语句前声明。

如果未指定 column_list,则 table 变量必须与 OUTPUT 结果集具有相同的列数。标识列和计算列除外,这两种列必须跳过。如果指定了 column_list,则任何省略的列都必须允许 Null 值,或者都分配有默认值。

有关 table 变量的详细信息,请参阅 表 (Transact-SQL)。

output_table
指定一个表,返回的行将被插入该表中而不是返回到调用方。output_table 可以为临时表。

如果未指定 column_list,则表必须与 OUTPUT 结果集具有相同的列数。标识列和计算列例外,必须跳过这两种列。如果指定了 column_list,则任何省略的列都必须允许 Null 值,或者都分配有默认值。

output_table 无法应用于以下情况:

具有启用的对其定义的触发器。


参与 FOREIGN KEY 约束的任意一方。


具有 CHECK 约束或启用的规则。


column_list
INTO 子句目标表上列名的可选列表。它类似于 INSERT 语句中允许使用的列列表。

scalar_expression
可取计算结果为单个值的任何符号和运算符的组合。scalar_expression 中不允许使用聚合函数。

对修改的表中的列的任何引用都必须使用 INSERTED 或 DELETED 前缀限定。

column_alias_identifier
用于引用列名的代替名称。

DELETED
指定由更新或删除操作删除的值的列前缀。以 DELETED 为前缀的列反映了 UPDATE、DELETE 或 MERGE 语句完成之前的值。

不能在 INSERT 语句中同时使用 DELETED 与 OUTPUT 子句。

INSERTED
列的前缀,指定由插入操作或更新操作添加的值。以 INSERTED 为前缀的列反映了在 UPDATE、INSERT 或 MERGE 语句完成之后但在触发器执行之前的值。

INSERTED 语句不能与 DELETE 语句的 OUTPUT 子句同时使用。

from_table_name
是一个列前缀,指定 DELETE、UPDATE 或 MERGE 语句(用于指定要更新或删除的行)的 FROM 子句中包含的表。

如果还在 FROM 子句中指定了要修改的表,则对该表中的列的任何引用都必须使用 INSERTED 或 DELETED 前缀限定。

*
指定受删除、插入或更新操作影响的所有列都将按照它们在表中的顺序返回。

例如,以下 DELETE 语句中的 OUTPUT DELETED.* 将返回 ShoppingCartItem 表中所有已删除的列:

复制代码
DELETE Sales.ShoppingCartItem
OUTPUT DELETED.*;


column_name
显式列引用。对要修改的表的任何引用都必须根据需要使用 INSERTED 或 DELETED 前缀加以正确限定,例如:INSERTED.column_name。

$action
仅可用于 MERGE 语句。在 MERGE 语句的 OUTPUT 子句中指定一个 nvarchar(10) 类型的列,该子句为每行返回以下三个值之一:'INSERT'、'UPDATE' 或 'DELETE',返回哪个值取决于对该行执行的操作。


JonasFeng 2009-06-02
  • 打赏
  • 举报
回复
--更新操作
update test1 set banlance=banlance+10 where id=1
--查询
select banlance From test1 where id = 1
s11ss 2009-06-02
  • 打赏
  • 举报
回复
update test1
set banlance=banlance+10
where id=1


select banlance
from test1
where id=1
等不到来世 2009-06-02
  • 打赏
  • 举报
回复
if object_id('[test1]') is not null drop table [test1]
go
create table [test1]([id] int,[name] varchar(4),[balance] int)
insert [test1]
select 1,'xixi',100 union all
select 2,'haha',300 union all
select 3,'hoho',120
go
--select * from [test1]

declare @t table(b int)

update test1
set balance=balance+10
output inserted.balance
into @t
where id=1

select * from @t
/*
b
-----------
110
*/

34,873

社区成员

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

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