問題が更新されました。この投稿の最後をご覧ください。
データをアーカイブする必要がある2つのテーブルがあります。1つ目は、顧客、サプライヤー、店舗、および請求書の番号を格納するINVOICEテーブルです。2つ目は、サプライヤ/請求書番号、およびラインアイテム番号と特定のアイテム情報を格納するINVOICELINEITEMテーブルです。つまり、INVOICEテーブルは請求書を顧客/サプライヤーに結び付け、INVOICELINEITEMテーブルはアイテムをその特定の請求書に結び付けます。
目標は、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.