处理SQL Server表的数据插入到错误列中


为了描述这个问题,我将创建一个简单的表,并且插入两个带有如下显示的相同数据类型的列。   
     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

  图五

  注意,交换列的系列可以按照任何顺序来给定。只要确保这个值在每个请求输出结果中传递即可。我认为这些方法对于每个人都很有用,只要交换列值,无需为临时列和变量而烦恼。

  因此下次你再遇到在一张表的多个列中交换数据,只需记住这个简单的方法。


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3