1

問題が更新されました。この投稿の最後をご覧ください。

データをアーカイブする必要がある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.
4

1 に答える 1

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
于 2012-11-19T18:11:38.333 に答える