2012-03-22 105 views
0

枝frnds我,從一個表將數據移動到另一個

我有兩個表說,「訂單」和「OrdersXML」

現在我想刪除的訂單,其超過7天前到OrdersXML表,我已經完成了使用sql適配器更新數據集的功能,該功能每次執行100行。 我想從訂單表中刪除已經移動到OrdersXML表的行 我如何實現這個?我想確保訂單中的行只有在插入OrdersXML後才被刪除。我不想丟失任何數據..甚至不會意外......

我應該使用觸發器嗎?或者我應該用C#編碼它本身?

作爲m使用數據適配器我無法獲得已插入的ID如果有任何異常之間進來..我可以??

回答

2

如果你想編寫SQL使用腳本,使用SqlCommand用SQL事務:

BEGIN TRANSACTION 

-- Copy rows from Orders to OrdersXML 

-- Delete rows from Orders that were copied 

COMMIT TRANSACTION 

如果你想使用對象和代碼來做到這一點,使用SqlTransaction對象:

// code sample adapted from MSDN 
using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    connection.Open(); 
    SqlTransaction transaction = connection.BeginTransaction("SampleTransaction"); 
    SqlCommand command = connection.CreateCommand(); 
    command.Transaction = transaction; 

    try 
    { 
     command.CommandText = "TODO"; // Copy rows from Orders to OrdersXML 
     command.ExecuteNonQuery(); 
     command.CommandText = "TODO"; // Delete copied rows from Orders 
     command.ExecuteNonQuery(); 

     // Attempt to commit the transaction. 
     transaction.Commit(); 
    } 
    catch (Exception ex) 
    { 
     try 
     { 
      // Attempt to roll back the transaction. 
      transaction.Rollback(); 
     } 
     catch (Exception ex2) 
     { 
      // This catch block will handle any errors that may have occurred 
      // on the server that would cause the rollback to fail, such as 
      // a closed connection. 
     } 
    } 
+0

這真的很不錯..請解釋一下什麼是「TODO」的意思,我是否需要把我的t-sql查詢放在那裏.. – 1Mayur 2012-03-22 13:27:16

+0

爲什麼做它作爲一個副本+刪除時,你可以在一個單一的命令?看到我的答案如何。 – 2012-03-22 13:30:20

+0

@Sirwani - 是的,「TODO」是你的SQL(我假設你已經擁有)來執行復制和刪除。由於您沒有發佈Orders或OrdersXML的架構,因此我沒有嘗試將SQL用於複製和刪除。 – Ryan 2012-03-22 16:20:21

1

我個人建議編寫一個存儲過程,以便不會有使用C#客戶端的延遲。然後你可以編寫一個腳本來每天或任何地方調用這個存儲過程。

查找「事務」,你可以這樣做,如果查詢的一部分失敗(即插入),則查詢的其餘部分回滾到先前的正常狀態。

2

使用DELETEOUTPUT條款,這樣做在一個聲明:

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 /*top (1000)*/ @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 

輸出:

   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) 

您可以使用TOP (...)必要對其加以限制。

+0

這是一個非常好的機制,可以在單個語句中複製和刪除數據。 – Ryan 2012-03-22 16:43:46

相關問題