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

它无法执行给我以下错误:

消息 213,级别 16,状态 1,过程 TransferAllLandingInformation,第 12 行 列名或提供的值的数量与表定义不匹配。

第 12 行就在 BEGIN 语句之后。

谁能告诉我为什么会这样。我绝不会声称自己精通 sql,因此这个特殊的错误目前让我很难过,我想从中学习。

只是为了清楚起见,这是在 SSMS 2012 中编写的。

谢谢

4

3 回答 3

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
...
于 2013-06-12T08:37:44.520 回答
2

它们没有相同的结构。

在查询中,您只是选择,因此这些语句将起作用。但是在过程中您的插入语句失败。

目标表中的列数或插入语句中指定的列数与插入语句中提供的值不匹配。

于 2013-06-12T08:39:31.520 回答
1

由于错误提示您尝试在目标表中插入比列数更多的值。要明确修复该类型的列名,例如:

INSERT INTO HistoricalData.HistoricalLandingHeaders (col1, col2)
SELECT Landings.LandingHeaders.val1, Landings.LandingHeaders.val2
FROM Landings.LandingHeaders
WHERE Landings.LandingHeaders.LandingDate1 <= @cutoffdate
于 2013-06-12T08:39:50.347 回答