2010-05-13 5 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'? –

+1

Я бы использовал это через INSERT и DELETE каждый раз, SQL Server, возможно, оптимизирует его лучше, и он гарантирует вам INSERT и DELETE только те же строки, не более и не менее. –

+0

Это одно утверждение, поэтому ... никаких транзакций не требуется, я думаю? – lance

0

Там нет такого понятия, как команды MOVE в SQL. Вы должны сначала вкладыш из таблицы 1 в таблицу 2 Затем снимите копию из таблицы 1.

+5

OP использует SQL Server 2005, так что [OUTPUT пункта (Transact-SQL)] (http://msdn.microsoft.com/en-us/library /ms177564.aspx) может сделать это в одной команде, см. мой ответ ... –

0

Нет, вы застряли в значительной степени с вставкой и удалением обернутой внутри транзакциями

+4

OP использует SQL Server 2005, поэтому [ВЫВОД (Transact-SQL)] (http://msdn.microsoft.com/en -us/library/ms177564.aspx) может сделать это в одной команде, см. мой ответ ... –

3

Вы можете попробовать вставить в аЬс (а, б, в) выбора (а, б, в) от четкости

делать выше, так вставит столбец а, б, в опр в столбцы a, b, c из abc. после вставки запустите таблицу удаления, отмените таблицу или утрите все ваши критерии.

образец:

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 
Смежные вопросы