2013-06-12 22 views
1

在我剛纔提到的最後一個問題非常客氣的回答之後,我現在想清理剛纔我將記錄轉移到這些記錄的歷史數據表中的表格,只是轉移。刪除Master-Details表中的記錄

我知道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 
+0

'WHERE INNER JOIN'顯然是錯的。應該是'DELETE Landings.LandingDetails FROM Landings.LandingDetails INNER JOIN' –

回答

2

更改您的第一個DELETE語句:

DELETE FROM Landings.LandingDetails 
WHERE LandingId IN 
      ( 
        SELECT Landings.LandingId 
        FROM Landings.LandingHeaders 
        WHERE Landings.LandingHeaders.LandingDate1 <= @cutoffdate 
      ) 
0

這不是在SQL Server中正確的是:

WHERE INNER JOIN 
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 
+0

非常感謝,現在我可以看到我的錯誤。 –

+0

@Dom Sinclair,我很樂意幫助你:) – Devart

+0

關於問題的第二部分(如你證明的那樣成功,以至於我的語法錯了),是否有任何根本錯誤的組合語句將記錄從當前到歷史表,然後聲明刪除從當前表移動的記錄? –