请问一个带事务存储过程怎么写?

Radar2006 2017-11-10 11:44:16
有一个表如下,两字段A和B
A | B
--------------------
1 | x
2 | y

如何交换两条记录的A值,变成

A | B
--------------------
2 | x
1 | y

我现在用个中间值,2->0,1->2,0>1这样,经常弄得两个一样的
A | B
--------------------
1 | x
1 | y

求教使用存储过程怎么样安全地交换两条记录的A值
传入两参数 1,2
...全文
650 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
nettman 2017-11-11
  • 打赏
  • 举报
回复
Radar2006 2017-11-11
  • 打赏
  • 举报
回复
混csdn十多年的新手,数据库方面还需要向各位多多学习 经版主点拔问题已顺利解决,谢谢各位
Radar2006 2017-11-10
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
update t set A = case when A = 1 then 2 else 1 end
好像很屌的样子,我试试
听雨停了 2017-11-10
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
update t set A = case when A = 1 then 2 else 1 end
这个更是高端大气上档次
听雨停了 2017-11-10
  • 打赏
  • 举报
回复
引用 楼主 Radar2006 的回复:
有一个表如下,两字段A和B A | B -------------------- 1 | x 2 | y 如何交换两条记录的A值,变成 A | B -------------------- 2 | x 1 | y 我现在用个中间值,2->0,1->2,0>1这样,经常弄得两个一样的 A | B -------------------- 1 | x 1 | y 求教使用存储过程怎么样安全地交换两条记录的A值 传入两参数 1,2
不用存储过程也不用事务,这样就可以

--> --> 听雨停了-->测试数据
 
if not object_id(N'Tempdb..#tab') is null
	drop table #tab
Go
Create table #tab(id int,name nvarchar(21))
Insert #tab
select 1,N'x' union all
select 2,N'y'
--测试数据结束

;with cte as (
SELECT a.*,b.id AS update_ID from #tab a
INNER JOIN #tab b ON a.id<>b.id
WHERE a.id IN (1,2) AND b.id IN (1,2)
)
UPDATE a SET id=b.update_ID
FROM #tab a 
INNER JOIN cte b ON a.id=b.id

SELECT * FROM #tab

id          name
----------- ---------------------
2           x
1           y
卖水果的net 版主 2017-11-10
  • 打赏
  • 举报
回复
update t set A = case when A = 1 then 2 else 1 end
繁花尽流年 2017-11-10
  • 打赏
  • 举报
回复
如果是任意固定记录数量的2条记录,LZ可以利用row_number()OVER()这个函数给记录编号。 然后定义2个变量把记录1,记录2要互换的2个值取出来。再根据前面生成的记录编号把2个值更新到新的对应记录上。 很简单的逻辑,新手可以当练手,就不提供你代码了。
繁花尽流年 2017-11-10
  • 打赏
  • 举报
回复
引用 10 楼 yisuylm 的回复:
[quote=引用 9 楼 qq_37170555 的回复:] [quote=引用 8 楼 日月路明的回复:][quote=引用 7 楼 qq_37170555 的回复:] [quote=引用 6 楼 yisuylm 的回复:] 版主的答案有问题,如果交换3,4的结果呢?
我来告诉你咋办哈

update t
set A = case when A = 3 then 4 else 3 end
where a in (3,4)
[/quote] 楼主的意思写一个存储过程,可以动态传参,交换任意两条记录的结果,你这么搞不是把楼主往坑里带吗[/quote] 把上面这个写成存储过程你不会?那我就没办法了哈[/quote] 我看这里很多问题都很初级,如果能够假定楼主知道怎么改写,那我就无话可说了[/quote] BBS开放式环境,新手的问题总是会多一点。可以耐心点还是会遇到有点意思的帖子。
Radar2006 2017-11-10
  • 打赏
  • 举报
回复
一条语句更好,用不用存储过程无所谓,能解决就行
日月路明 2017-11-10
  • 打赏
  • 举报
回复
引用 9 楼 qq_37170555 的回复:
[quote=引用 8 楼 日月路明的回复:][quote=引用 7 楼 qq_37170555 的回复:] [quote=引用 6 楼 yisuylm 的回复:] 版主的答案有问题,如果交换3,4的结果呢?
我来告诉你咋办哈

update t
set A = case when A = 3 then 4 else 3 end
where a in (3,4)
[/quote] 楼主的意思写一个存储过程,可以动态传参,交换任意两条记录的结果,你这么搞不是把楼主往坑里带吗[/quote] 把上面这个写成存储过程你不会?那我就没办法了哈[/quote] 我看这里很多问题都很初级,如果能够假定楼主知道怎么改写,那我就无话可说了
听雨停了 2017-11-10
  • 打赏
  • 举报
回复
引用 8 楼 日月路明的回复:
[quote=引用 7 楼 qq_37170555 的回复:] [quote=引用 6 楼 yisuylm 的回复:] 版主的答案有问题,如果交换3,4的结果呢?
我来告诉你咋办哈

update t
set A = case when A = 3 then 4 else 3 end
where a in (3,4)
[/quote] 楼主的意思写一个存储过程,可以动态传参,交换任意两条记录的结果,你这么搞不是把楼主往坑里带吗[/quote] 把上面这个写成存储过程你不会?那我就没办法了哈
日月路明 2017-11-10
  • 打赏
  • 举报
回复
引用 7 楼 qq_37170555 的回复:
[quote=引用 6 楼 yisuylm 的回复:] 版主的答案有问题,如果交换3,4的结果呢?
我来告诉你咋办哈

update t
set A = case when A = 3 then 4 else 3 end
where a in (3,4)
[/quote] 楼主的意思写一个存储过程,可以动态传参,交换任意两条记录的结果,你这么搞不是把楼主往坑里带吗
听雨停了 2017-11-10
  • 打赏
  • 举报
回复
引用 6 楼 yisuylm 的回复:
版主的答案有问题,如果交换3,4的结果呢?
我来告诉你咋办哈

update t
set A = case when A = 3 then 4 else 3 end
where a in (3,4)
日月路明 2017-11-10
  • 打赏
  • 举报
回复
版主的答案有问题,如果交换3,4的结果呢?
听雨停了 2017-11-10
  • 打赏
  • 举报
回复
引用 4 楼 Radar2006 的回复:
[quote=引用 1 楼 wmxcn2000 的回复:] update t set A = case when A = 1 then 2 else 1 end
好像很屌的样子,我试试[/quote] 必须很吊,你也不看水果版主是谁,版主可不是相当就可以当的,那得有多大实力啊

34,838

社区成员

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

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