2010-05-13 102 views
17

我有两个具有相同列定义的表。我需要从一个表格移动(不复制)一行到另一个表格。在我退出并使用INSERT INTO/DELETE(在事务中)之前,有没有更智能的方法?将行从一个表移动到另一个表?

SQL Server 2005中

回答

32

为SQL Server 2005中删除复制和起来,尝试OUTPUT Clause (Transact-SQL)条款:

DELETE OldTable 
    OUTPUT DELETED.col1, DELETED.col2... 
     INTO NewTable 
    WHERE ID=... 

工作例如:

DECLARE @OldTable table(col1 int, col2 varchar(5), col3 char(5), col4  datetime) 
DECLARE @NewTable table(col1 int, column2 varchar(5), col3 int , col_date char(23), extravalue int, othervalue varchar(5)) 
INSERT @OldTable VALUES (1 , 'AAA' ,'A' ,'1/1/2010'   ) 
INSERT @OldTable VALUES (2 , 'BBB' ,'12' ,'2010-02-02 10:11:22') 
INSERT @OldTable VALUES (3 , 'CCC' ,null ,null    ) 
INSERT @OldTable VALUES (4 , 'B' ,'bb' ,'2010-03-02'  ) 

DELETE @OldTable 
    OUTPUT DELETED.col1 
      ,DELETED.col2 
      ,CASE 
       WHEN ISNUMERIC(DELETED.col3)=1 THEN DELETED.col3 
       ELSE NULL END 
      ,DELETED.col4 
      ,CONVERT(varchar(5),DELETED.col1)+'!!' 
     INTO @NewTable (col1, column2, col3, col_date, othervalue) 
    OUTPUT 'Rows Deleted: ', DELETED.* --this line returns a result set shown in the OUTPUT below 
    WHERE col1 IN (2,4) 

SELECT * FROM @NewTable 

OUT PUT:

   col1  col2 col3 col4 
-------------- ----------- ----- ----- ----------------------- 
Rows Deleted: 2   BBB 12 2010-02-02 10:11:22.000 
Rows Deleted: 4   B  bb 2010-03-02 00:00:00.000 

(2 row(s) affected) 

col1  column2 col3  col_date    extravalue othervalue 
----------- ------- ----------- ----------------------- ----------- ---------- 
2   BBB  12   Feb 2 2010 10:11AM  NULL  2!! 
4   B  NULL  Mar 2 2010 12:00AM  NULL  4!! 

(2 row(s) affected) 
+1

@KM:+1。我没有意识到这一点。你会推荐使用'INSERT'和'DELETE'这个方法吗? – 2010-05-13 19:18:22

+1

我会在每次使用INSERT和DELETE时使用它,SQL Server可能会更好地对它进行优化,并且它可以保证INSERT和DELETE只有相同的行,不多也不少。 – 2010-05-13 19:20:24

+0

这是一个陈述,所以......没有必要的交易,我猜? – lance 2010-05-13 19:22:04

0

有没有这样的事情在SQL移动操作。 你必须先插入从表1至表2 然后从表1

+5

OP是使用SQL Server 2005,所以[OUTPUT子句(Transact-SQL)](http://msdn.microsoft.com/en-us/library /ms177564.aspx)可以在单个命令中执行此操作,请参阅我的答案... – 2010-05-13 19:24:11

0

不,你几乎套牢插入和删除包裹交易

+4

OP正在使用SQL Server 2005,所以[OUTPUT子句(Transact-SQL)](http://msdn.microsoft.com/zh-cn/ -us/library/ms177564.aspx)可以在单个命令中完成,请参阅我的答案... – 2010-05-13 19:22:41

3

您可以尝试插入农行(A,B,C) 选择(A,B,C)从高清

做的上方,从而将插入列A,B,C(防守)到abc的a,b,c列中。插入后运行删除表,删除表或截断任何您的标准。

样品是:

Begin 
    Begin try 

     Begin Transaction 

       Insert into emp(name, department, salary)      
         Select empName,empDepartment,empSal from employees 
         Where employees.empID = 211 

       Truncate table employees 

      End Transaction 

    End try 

    Begin Catch 

     if @@Error > 0 
       Rollback Transaction 

    End Catch 

End 
0
INSERT dbo.newtable(
     name, 
     department, 
     Salary 
) SELECT 
      name, 
      FirstName, 
      Lastname 
     FROM (
      DELETE dbo.oldtable 
      OUTPUT 
        DELETED.name, 
        DELETED.department, 
        DELETED.Salary 
      WHERE ID IN (1001, 1003, 1005) 
    ) AS RowsToMove 

SELECT * FROM dbo.newtable 
SELECT * FROM dbo.oldtable 
相关问题