以下T-SQL代码段有效,但我想知道是否有更聪明和/或更简洁的方法来完成两个不同行之间的字段值交换。 (为简单起见,代码具有硬编码的pkey值。)
BEGIN TRAN;
declare @swapFormSeqA int;
declare @swapFormSeqB int;
SELECT @swapFormSeqA = DisplaySeq
FROM CustomCatalogForm
WHERE CustomCatalogFormId = 1;
SELECT @swapFormSeqB = DisplaySeq
FROM CustomCatalogForm
WHERE CustomCatalogFormId = 2;
UPDATE CustomCatalogForm
SET DisplaySeq = @swapFormSeqB
WHERE CustomCatalogFormId = 1;
UPDATE CustomCatalogForm
SET DisplaySeq = @swapFormSeqA
WHERE CustomCatalogFormId = 2;
COMMIT TRAN;
编辑:我特意使用Sql2k5,因此2k8不是一个选项。
答案 0 :(得分:3)
你可以这样做:
begin tran
declare @sum int
select @sum = sum(DisplaySeq)
from CustomCatalogForm
where CustomCatalogFormId in (1,2)
update CustomCatalogForm
set DisplaySeq = @sum - DisplaySeq
where CustomCatalogFormId in (1,2)
commit tran
答案 1 :(得分:0)
像这样:
UPDATE CustomCatalogForm
SET DisplaySeq = (SELECT DisplaySeq
FROM CustomCatalogForm T2
WHERE T2.CustomCatalogFormId =
-1*(CustomCatalogForm.CustomCatalogFormId -2) +1
)
WHERE CustomCatalogFormId IN (1,2);
(警告:请先测试一下,因为我无法从这里测试)。
答案 2 :(得分:0)
假设您的表格如下:
--drop table CustomCatalogForm
create table CustomCatalogForm
(
CustomCatalogFormId int not null
,DisplaySeq char(1) not null
)
insert CustomCatalogForm (CustomCatalogFormId, DisplaySeq)
values (1,'A')
insert CustomCatalogForm (CustomCatalogFormId, DisplaySeq)
values (2,'B')
insert CustomCatalogForm (CustomCatalogFormId, DisplaySeq)
values (3,'C')
insert CustomCatalogForm (CustomCatalogFormId, DisplaySeq)
values (4,'D')
然后这将对任何两个给定值(我用2和3测试)进行:
select * from CustomCatalogForm
-------------------------------
DECLARE
@Item1 int
,@Item2 int
SET @Item1 = 2
SET @Item2 = 3
UPDATE CustomCatalogForm
set DisplaySeq = ccf2.DisplaySeq
from CustomCatalogForm ccf
inner join (select CustomCatalogFormId, DisplaySeq
from CustomCatalogForm
where CustomCatalogFormId = @Item1
or CustomCatalogFormId = @Item2) ccf2
on ccf.CustomCatalogFormId <> ccf2.CustomCatalogFormId
where ccf.CustomCatalogFormId = @Item1
or ccf.CustomCatalogFormId = @Item2
-------------------------------
select * from CustomCatalogForm
诀窍是只在连接的两侧获取两行,并加入NOT EQUALS。
答案 3 :(得分:0)
试试这个:
UPDATE ccf SET
DisplaySeq = Case CustomCatalogFormId
When 1 Then T2.DisplaySeq
When 2 Then T1.DisplaySeq End
From CustomCatalogForm ccf
Join CustomCatalogForm T1 On T1.CustomCatalogFormId = 1
Join CustomCatalogForm T2 On T2.CustomCatalogFormId = 2
Where ccf.CustomCatalogFormId In (1,2)