2013-06-12 59 views
0

我正在編寫一些存儲過程以將用於當前年份記錄的表中的數據傳輸到用於存儲歷史數據的表中。我目前正在處理的一個示例是典型的主從關係,其中明細記錄顯然需要在主記錄之前處理。我寫了一個簡單的測試查詢來收集一些示例記錄,看看我是否正確編寫了基本的sql。爲什麼查詢自己執行而不是在存儲過程中執行

DECLARE @cuttoffdate date = '31/03/2009' 
SELECT 
    * 
FROM Landings.LandingDetails 
INNER JOIN Landings.LandingHeaders 
    ON Landings.LandingHeaders.LandingId = Landings.LandingDetails.LandingId 
WHERE Landings.LandingHeaders.LandingDate1 <= @cuttoffdate 


SELECT 
    * 
FROM Landings.LandingHeaders 

WHERE Landings.LandingHeaders.LandingDate1 <= @cuttoffdate 

這工作併產生我期望的兩組記錄。然而,當我再在存儲過程中使用:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [HistoricalData].[TransferAllLandingInformation] 
-- 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 
    INSERT INTO HistoricalData.HistoricalLandingDetails 
     SELECT 
      * 
     FROM Landings.LandingDetails 
     INNER JOIN Landings.LandingHeaders 
      ON Landings.LandingHeaders.LandingId = Landings.LandingDetails.LandingId 
     WHERE Landings.LandingHeaders.LandingDate1 <= @cutoffdate 


    INSERT INTO HistoricalData.HistoricalLandingHeaders 
     SELECT 
      * 
     FROM Landings.LandingHeaders 

     WHERE Landings.LandingHeaders.LandingDate1 <= @cutoffdate 
END 
GO 

它無法執行給我下面的錯誤:

Msg 213, Level 16, State 1, Procedure TransferAllLandingInformation, Line 12 Column name or number of supplied values does not match table definition.

線12是剛過BEGIN語句。

任何人都可以啓發我爲什麼發生這種情況。我絕不會聲稱在sql中流利,結果這個特殊的錯誤讓我目前陷入困境,我想從中學習。

只是爲了清楚起見,這是被寫入2012年SSMS

感謝

+1

您正在試圖加入到HistoricalLandingDetails從FROM Landings.LandingDetails各個領域 INNER JOIN Landings.LandingHeaders – bummi

回答

4

該錯誤信息表明你有HistoricalLandingDetails的結果通過了你的選擇查詢返回的列的數量不同所有來自HistoricalLandingDetails和LandingHeaders的數據。

我會建議在插入和選擇中指定列以確保所有內容都匹配例如

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [HistoricalData].[TransferAllLandingInformation] 
-- 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 
    INSERT INTO HistoricalData.HistoricalLandingDetails (cola, colb, colc) 
     SELECT 
      ld.cola, ld.colb, ld.colc 
     FROM Landings.LandingDetails ld 
     INNER JOIN Landings.LandingHeaders lh 
... 
2

它們不具有相同的結構。

在查詢中,你只是選擇這樣的語句才能工作。但是在過程中,插入語句失敗。

目標表中的列數或Insert語句中指定的列數與Insert語句中提供的值不匹配。

1

由於錯誤提示您嘗試在目標表中插入比列數更多的值。要明確解決這個類型的列名,例如:

INSERT INTO HistoricalData.HistoricalLandingHeaders (col1, col2) 
SELECT Landings.LandingHeaders.val1, Landings.LandingHeaders.val2 
FROM Landings.LandingHeaders 
WHERE Landings.LandingHeaders.LandingDate1 <= @cutoffdate