2010-05-13 16 views
17

Tengo dos tablas con las mismas definiciones de columna. Necesito mover (no copiar) una fila de una tabla a otra. Antes de salir y usar INSERT INTO/DELETE (en una transacción), ¿hay alguna manera más inteligente?¿Mover la fila de una tabla a otra?

SQL Server 2005

Respuesta

32

para SQL Server 2005 y, se debe intentar la cláusula OUTPUT Clause (Transact-SQL):

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

ejemplo de trabajo:

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. No estaba enterado de esto. ¿Recomendarías este método sobre 'INSERT' y' DELETE'? –

+1

Usaría esto sobre un INSERT y un DELETE cada vez, SQL Server probablemente pueda optimizarlo mejor y le garantiza INSERTAR y ELIMINAR solo las mismas filas, ni más ni menos. –

+0

Esta es una afirmación, así que ... ¿no es necesaria ninguna transacción, supongo? – lance

0

No hay tal cosa como un comando MOVE en SQL. Vas a tener que primera inserción de la tabla 1 de la tabla 2 A continuación, retire la copia de la Tabla 1.

+5

OP está utilizando SQL Server 2005, por lo que la [cláusula OUTPUT (Transact-SQL)] (http://msdn.microsoft.com/en-us/library /ms177564.aspx) puede hacerlo en un solo comando, vea mi respuesta ... –

0

No, usted está bastante atascado con insertar y eliminar envuelto dentro de una transacción

+4

OP está utilizando SQL Server 2005, por lo que [Cláusula de salida (Transact-SQL)] (http://msdn.microsoft.com/en -us/library/ms177564.aspx) puede hacerlo en un solo comando, ver mi respuesta ... –

3

Usted puede intentar Insertar en abc (a, b, c) seleccione (a, b, c) de la definición

haciendo por encima de lo que se inserte la columna a, b, c de def en la columna a, b, c de abc. Después de insertar, ejecute una tabla de eliminación, una tabla desplegable o trunque cualquiera que sea su criterio.

muestra es:

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 
Cuestiones relacionadas