2010-05-13 15 views
17

Tôi có hai bảng có cùng định nghĩa cột. Tôi cần phải di chuyển (không sao chép) một hàng từ bảng này sang bảng khác. Trước khi tôi đi và sử dụng INSERT INTO/DELETE (trong một giao dịch), có cách nào thông minh hơn không?Di chuyển hàng từ bảng này sang bảng khác?

SQL Server 2005

Trả lời

32

cho SQL Server 2005 trở lên, thử OUTPUT Clause (Transact-SQL) khoản:

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

dụ làm việc:

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. Tôi đã không nhận thức được điều này. Bạn có đề xuất phương pháp này qua 'INSERT' và' DELETE' không? –

+1

Tôi sẽ sử dụng điều này trên một INSERT và DELETE mỗi lần, SQL Server có thể tối ưu hóa nó tốt hơn và nó đảm bảo bạn INSERT và DELETE chỉ các hàng tương tự, không nhiều hơn và không kém. –

+0

Đây là một tuyên bố, vì vậy ... không có giao dịch cần thiết, tôi đoán? – lance

0

Không có điều nào như lệnh MOVE trong SQL. Bạn sẽ phải chèn đầu tiên từ bảng 1 đến bảng 2 Sau đó, loại bỏ các bản sao từ bảng 1.

+5

OP đang sử dụng SQL Server 2005, vì vậy [OUTPUT khoản (Transact-SQL)] (http://msdn.microsoft.com/en-us/library /ms177564.aspx) có thể làm điều đó trong một lệnh duy nhất, xem câu trả lời của tôi ... –

0

Không, bạn có khá nhiều khó khăn với chèn và xóa bọc bên trong một giao dịch

+4

OP đang sử dụng SQL Server 2005, vì vậy [OUTPUT khoản (Transact-SQL)] (http://msdn.microsoft.com/vi -us/library/ms177564.aspx) có thể làm điều đó trong một lệnh duy nhất, xem câu trả lời của tôi ... –

3

Bạn có thể thử Chèn vào abc (a, b, c) chọn (a, b, c) từ def

làm ở trên như vậy sẽ chèn cột a, b, c của def vào cột a, b, c của abc. sau khi chèn chạy một bảng xóa, thả bảng hoặc cắt bớt bất cứ điều gì là tiêu chí của bạn.

mẫu là:

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