2010-05-13 96 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 
相關問題