問題已更新,請參閱本帖文章結束:歸檔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.
你有沒有實際創建'archive.Invoice'表?您正在使用的用戶是否有權查看「archive.Invoice」?如果您稍後想要將COMMIT或ROLLBACK作爲TRANSACTION,則需要'BEGIN TRANSACTION'。 – MatBailie
是的,存檔發票表存在,我有權查看它。我確實有BEGIN等。爲了清楚起見,我會將其添加到原始帖子中,謝謝。 – fullOfQuestions
請注意'BEGIN TRANSACTION'和'BEGIN'完全不同。第二個錯誤是說你從未開始交易,所以你不能回滾。在嘗試INSERT之前需要一個'BEGIN TRANSACTION',並且在INSERT成功的執行路徑中需要一個'COMMIT TRANSACTION'。至於第一個錯誤信息,你仍然被告知'archive.INVOICE'不存在。你是用不同的數據庫還是不同的模式創建它的? 'archive.dbo.Invoice'和'archive.Invoice'是非常不同的。 – MatBailie