为了描述这个问题,我将创建一个简单的表,并且插入两个带有如下显示的相同数据类型的列。
CREATE TABLE SwapData(id int,value1 varchar(50),value2 varchar(50))
GO
现在这个表已经创建了,接下来我们在这个表中插入一些值。在这里,我使用一个UNION ALL语句,因此我就可以做一次INSERT,但是这也可以通过执行几个插入语句来完成。
INSERT INTO Swapdata
SELECT 1,10,100
UNION ALL
SELECT 2,20,200
UNION ALL
SELECT 3,30,300
UNION ALL
SELECT 4,40,400
UNION ALL
SELECT 5,50,500
UNION ALL
SELECT 6,60,600
UNION ALL
SELECT 7,70,700
UNION ALL
SELECT 8,80,800
UNION ALL
SELECT 9,90,900
UNION ALL
SELECT 10,11,110
正如下面的图像所示,这将在“value1”和“value2”中插入具有不同值的十行。
图一
现在数据已经插入,我们可以看到较大的值应该在"value1"。因此现在我们需要交换“value1” 和“value2”中的值。
这里有很多种方法来解决这个问题。正如在问题部分所讨论的,你可以删除这些数据然后再重新插入,或者你可以创建一个新的列然后把这些数据移过去,但是这里还有更简单的方法。
其中一个间的方法显示如下,那就是创建一个临时的变量,这个变量允许你更新数据和交换列值。
DECLARE @temp AS varchar(50)
UPDATE swapdata SET @temp=value2,value2=value1,value1=@temp
我们不是在这个表中创建一个临时列,而是通过声明一个临时变量来交换这两个列中的数据。上面的代码解释如下:
首先创建一个临时变量。
然后把列"value2"的数据放在@temp变量中。
接着把列"value1"的数据放在"value2"列中。
最后把@temp的值放在"value1"列中。
现在,我们来查询这个表的行。
SELECT * FROM swapdata
我们可以看到我们的表已经正确更新了。
图二
但是我发现最好的解决方法是不用任何临时变量。
只需执行下面的T-SQL,它将交换列数据。
UPDATE swapdata SET value2=value1,value1=value2
它把数据从value1迁移到value 2,同时也把value2的数据迁移到value 1。
现在,我们来查询这个表。我们可以看到数据已经交换回原来的位置。
SELECT * FROM swapdata
图三
我尝试相同的砝码来解决三个列的问题。
让我们在“swapdata”表中再添加第三个列“value3”。
ALTER TABLE swapdata ADD value3 varchar(50)
GO
UPDATE swapdata SET value3=value2+'0'
SELECT * FROM swapdata
图四
让我们如下交换这些列的值:
· "value1"获得"value3"的数据
· "value2"获得"value1"的数据
· "value3"获得"value2"的数据
我们将按照第二种解决方法来获得这个结果。
UPDATE swapdata SET value1=value3,value2=value1,value3=value2
SELECT * FROM swapdata
图五
注意,交换列的系列可以按照任何顺序来给定。只要确保这个值在每个请求输出结果中传递即可。我认为这些方法对于每个人都很有用,只要交换列值,无需为临时列和变量而烦恼。
因此下次你再遇到在一张表的多个列中交换数据,只需记住这个简单的方法。