2012-11-19 39 views
1

問題已更新,請參閱本帖文章結束:歸檔SQL Server數據

我有兩個表格需要歸檔數據。第一個是存儲客戶,供應商,商店和發票號碼的INVOICE表。第二個是發票行項目表,用於存儲供應商/發票編號,以及訂單項編號和特定項目信息。換句話說,INVOICE表將發票與客戶/供應商聯繫在一起,而INVOICE LINE ITEM表將項目與特定發票聯繫起來。

目標是歸檔這些大於2歲的表中的任何數據。問題是INVOICE LINE ITEM表中沒有日期,只有INVOICE表。以下是我迄今爲止:

IF @CutOffDate IS NULL 
BEGIN 
    SET @CutOffDate = DATEADD(mm, -24, CURRENT_TIMESTAMP) 

END 
ELSE 
BEGIN 
    IF @CutOffDate > DATEADD(mm, -24, CURRENT_TIMESTAMP) 
    BEGIN 
     RAISERROR ('Cannot delete data from last 24 months', 16, 1) 
     RETURN -1 
    END 
END 

BEGIN TRAN 


    INSERT INTO archive.INVOICE 
      SELECT * 
      FROM INVOICE 
    WHERE invoice_date < @CutOffDate 

    IF @@ERROR <> 0 
    BEGIN 
     ROLLBACK TRAN 
     RAISERROR ('Error occured while moving data from INVOICE', 16, 1) 
     RETURN -1 
    END 

    INSERT INTO archive.INVOICE_LINE_ITEM 
      SELECT * 
      FROM INVOICE_LINE_ITEM 
    WHERE invoice= 
     (Select invoice 
     From INVOICE 
     WHERE invoice_date < @CutOffDate 
     ) 

    IF @@TRANCOUNT > 0 
    BEGIN 
     COMMIT TRAN 
     RETURN 0 
    END 

END 

的問題是,我得到這個錯誤,每當我試圖執行它:

Msg 208, Level 16, State 1, Procedure ArchiveData, Line 26 
Invalid object name 'archive.INVOICE'. 
Msg 266, Level 16, State 2, Procedure ArchiveData, Line 26 
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1. 

但我知道一個事實,即archive.INVOICE確實存在(我現在正在看)。我一直在爲此奮戰數日,請幫忙!如果您需要更多信息,請告訴我!

編輯:

謝謝演示,事實證明,第一個錯誤是怎麼回事,因爲其他數據庫是一個獨立的模式。非常愚蠢,我沒有注意到。

不過,現在的第一部分工作,但我遇到一個問題,當我得到這個代碼:

INSERT INTO argus_archive.argus.INVOICE_LINE_ITEM 
     SELECT * 
     FROM argus.INVOICE_LINE_ITEM 
     WHERE invoice= 
      (Select invoice 
      From argus.INVOICE 
      WHERE invoice_date < @CutOffDate 
      ) 

的目標是歸檔所有對應於剛剛存檔的發票行,但由於每一張發票的行項目表中有多個行,我得到這個錯誤:

Msg 512, Level 16, State 1, Procedure ArchiveData, Line 38 
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 
+0

你有沒有實際創建'archive.Invoice'表?您正在使用的用戶是否有權查看「archive.Invoice」?如果您稍後想要將COMMIT或ROLLBACK作爲TRANSACTION,則需要'BEGIN TRANSACTION'。 – MatBailie

+0

是的,存檔發票表存在,我有權查看它。我確實有BEGIN等。爲了清楚起見,我會將其添加到原始帖子中,謝謝。 – fullOfQuestions

+1

請注意'BEGIN TRANSACTION'和'BEGIN'完全不同。第二個錯誤是說你從未開始交易,所以你不能回滾。在嘗試INSERT之前需要一個'BEGIN TRANSACTION',並且在INSERT成功的執行路徑中需要一個'COMMIT TRANSACTION'。至於第一個錯誤信息,你仍然被告知'archive.INVOICE'不存在。你是用不同的數據庫還是不同的模式創建它的? 'archive.dbo.Invoice'和'archive.Invoice'是非常不同的。 – MatBailie

回答

1

像錯誤信息顯示,您的子查詢返回不止一個值,而不能使用=進行比較。

相反,我會建議一個JOIN,並添加DISTINCT以匹配預期的原始功能:

INSERT INTO argus_archive.argus.INVOICE_LINE_ITEM 
SELECT DISTINCT ilt.* 
FROM 
    argus.INVOICE_LINE_ITEM ilt 
    JOIN argus.INVOICE i 
     ON i.invoice = ilt.invoice 
     AND i.invoice_date < @CutOffDate 

編輯:

刪除:

DELETE ilt 
FROM 
    argus.INVOICE_LINE_ITEM ilt 
    JOIN argus.INVOICE i 
     ON i.invoice = ilt.invoice 
     AND i.invoice_date < @CutOffDate 
+0

太棒了,那個招數謝謝你!最後一個簡短的問題,我會關閉它。我可以使用相同的語法從生產數據庫中刪除這些記錄嗎?所以:刪除argus.INVOICE_LINE_ITEM SELECT DISTINCT ILT * FROM ILT argus.INVOICE_LINE_ITEM \t \t JOIN argus.INVOICE我 \t \t \t在i.invoice = ilt.invoice \t \t \t和i.invoice_date <@CutOffDate – fullOfQuestions

+0

感謝您的幫助,現在一切正常! – fullOfQuestions