1

少し前の私の最後の質問に対する非常に親切な回答に続いて、レコードを転送したばかりのテーブルを、転送したばかりのレコードの履歴データ テーブルにクリーンアップしたいと思います。

DELETE FROM は明らかにしたくないすべてのレコードを削除することを知っているので、where ステートメントで条件を付ける必要があります。

私がこれまでに持っているものは次のとおりです。

CREATE PROCEDURE [HistoricalData].[ClearAllLandingInformation]
-- Add the parameters for the stored procedure here
@cutoffdate date
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
DELETE FROM Landings.LandingDetails
WHERE INNER JOIN Landings.LandingHeaders
            ON Landings.LandingHeaders.LandingId = Landings.LandingDetails.LandingId
        WHERE Landings.LandingHeaders.LandingDate1 <= @cutoffdate

DELETE FROM Landings.LandingHeaders
WHERE LandingDate1 <= @cutoffdate
GO

SQL を実行してプロシージャを作成しようとすると、INNER という単語の近くで構文が間違っているというエラー メッセージが表示されます (括弧の有無にかかわらず)。それは単に私の側の構文の構成が不十分な場合ですか、それともマスター テーブルの条件に基づいて詳細テーブルからレコードを削除できませんか?

最後に、悪いのは私のSQL構文であるという現在の仮定に取り組んでいます。最初に現在のテーブルから履歴テーブルにレコードを転送し、次に転送されたそれらのレコードを削除する手順を作成することに根本的に問題があります現在のテーブルから。最終的な目標は、エンティティ モデルにインポートして、エンド ユーザーが単一の関数として実行できるストアド プロシージャを作成することです。

ありがとう

これは、特定の基準を満たすレコードを移動してから削除するための結合された spoc での私の試みです。元のテーブル (最後の部分) からの削除には成功しますが、元の部分への転送には成功しません。

    ALTER PROCEDURE [HistoricalData].[MoveAndClearLandingInformation] -- Add the parameters for the stored procedure here
@cutoffdate date
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    --First collect and move the required information

    INSERT INTO HistoricalData.HistoricalLandingHeaders
            SELECT
                LandingId,
                VesselId,
                TicketNumber,
                LandingDate1,
                PortOfLanding,
                CountryOfLanding,
                Logbook1,
                Loogbook2,
                Logbook3,
                LandingDecNumber1,
                LandingDecNumber2,
                LandingDecNumber3,
                DateOfPurchase,
                Posted,
                AllocatedErsId,
                LandingDate2,
                LandingDate3,
                VesselName,
                VesselOwner,
                VesselPLN,
                ModifiedDate
            FROM Landings.LandingHeaders

            WHERE Landings.LandingHeaders.LandingDate1 <= @cutoffdate

        INSERT INTO HistoricalData.HistoricalLandingDetails
            SELECT
                LandingDetails.LandingId,
                ProductId,
                PresentationCode,
                PresentationState,
                FreshnessGrade,
                ProductSize,
                FishingArea,
                IcesZone,
                Quantity,
                UnitPrice,
                LandingDetailVatRate,
                SpeciesCode,
                Currency,
                ProductLandedUnderQuota,
                LandingDetails.ModifiedDate


            FROM Landings.LandingDetails
            INNER JOIN Landings.LandingHeaders
                ON Landings.LandingHeaders.LandingId = Landings.LandingDetails.LandingId
            WHERE Landings.LandingHeaders.LandingDate1 <= @cutoffdate






        --  Now remove that information from the current tables


        DELETE FROM ld
            FROM Landings.LandingDetails ld
            JOIN Landings.LandingHeaders lh
                ON ld.LandingId = lh.LandingId
        WHERE lh.LandingDate1 <= @cutoffdate

        DELETE FROM Landings.LandingHeaders
        WHERE LandingDate1 <= @cutoffdate
    END
4

3 に答える 3

3

最初の削除ステートメントを次のように変更します。

DELETE FROM Landings.LandingDetails
WHERE LandingId IN 
             ( 
                  SELECT Landings.LandingId
                  FROM Landings.LandingHeaders
                  WHERE Landings.LandingHeaders.LandingDate1 <= @cutoffdate
             )
于 2013-06-12T09:46:01.983 に答える
2

これを試してみてください -

CREATE PROCEDURE [HistoricalData].[ClearAllLandingInformation]

@cutoffdate DATE

AS BEGIN

    SET NOCOUNT ON;

    DELETE FROM ld
    FROM Landings.LandingDetails ld
    JOIN Landings.LandingHeaders lh ON ld.LandingId = lh.LandingId
    WHERE lh.LandingDate1 <= @cutoffdate

    DELETE FROM Landings.LandingHeaders
    WHERE LandingDate1 <= @cutoffdate

END

更新 (FK がある場合):

CREATE TABLE Landings.LandingHeaders
(
      LandingId  INT PRIMARY KEY NOT NULL
    , LandingDate1 DATETIME
)
CREATE TABLE Landings.LandingDetails(
    ID INT PRIMARY KEY NOT NULL,
    LandingId INT NOT NULL
)
GO

ALTER TABLE Landings.LandingDetails WITH CHECK 
ADD CONSTRAINT FK_LandingId FOREIGN KEY(LandingId)
REFERENCES Landings.LandingHeaders (LandingId)
ON DELETE CASCADE
GO

ALTER TABLE Landings.LandingDetails CHECK CONSTRAINT FK_LandingId
GO

CREATE PROCEDURE [HistoricalData].[ClearAllLandingInformation]

    @cutoffdate DATE

AS BEGIN

    SET NOCOUNT ON;

    DELETE FROM Landings.LandingHeaders
    WHERE LandingDate1 <= @cutoffdate

END
于 2013-06-12T09:46:55.917 に答える
0

これは SQL Server では正しくありません。

WHERE INNER JOIN
于 2013-06-12T09:46:21.260 に答える