存储过程中的"无效列名称"

Fra*_*ppa 0 sql t-sql sql-server stored-procedures sql-server-2008-r2

我编写了一个存储过程来将未来日期(不包括Sat和Sun)插入到永久表中.例程只使用一个临时表.这篇文章的目的不是批评存储过程.虽然,我确信它可以改进.但是,这篇文章的目的是分析为什么存储过程在一组情况下而不是其他情况下调用时会抛出这些错误.

1 - 这是我收到的错误

Msg 207, Level 16, State 1, Procedure MAKE_FUTURE_DATES, Line 25
Invalid column name 'tdate'.
Msg 207, Level 16, State 1, Procedure MAKE_FUTURE_DATES, Line 31
Invalid column name 'wday'.
Run Code Online (Sandbox Code Playgroud)

2 - 这是存储过程

ALTER PROCEDURE [dbo].[MAKE_FUTURE_DATES] (@STARTDATE DATE)
AS
BEGIN
-- We need to populate FUTURE_DATES (table) with forward looking dates (week days only) 
-- We do not consider/exclude holidays here. We just exclude Sat/Suns

-- Temp table to hold the dates and days of the week
    CREATE TABLE #TMP_DATES(
        [tdate] [date] NULL,
        [wday] [varchar](10) NULL,  
        )

    -- To generate 'enough' future dates loop up to 1199 days in the future
    -- and insert dates that start with the current date and increase with each loop

    DECLARE @Loop INT
    SET @Loop = 0
    WHILE @Loop < 1200
    BEGIN
        INSERT INTO #TMP_DATES (tdate) VALUES (DATEADD(weekday,@Loop,@STARTDATE))   
        SET @Loop = @Loop + 1
    END

    -- Now update the wday column with the weekday name so we can get rid of
    -- Sat/Sun in the next step

    UPDATE #TMP_DATES
    SET wday = UPPER(LEFT(DATENAME(dw,tdate),3))

    -- Get rid of Sat/Sun
    DELETE FROM #TMP_DATES WHERE wday = 'SAT' or wday = 'SUN'

    -- Now clear the final destination table
    TRUNCATE TABLE FUTURE_DATES

    -- Insert the weekday dates into future_dates

    INSERT INTO FUTURE_DATES (fdate,wday)
    SELECT tdate,wday FROM #TMP_DATES

    DROP TABLE #TMP_DATES
Run Code Online (Sandbox Code Playgroud)

3 - 我在后台(通过SQL Server作业调度程序)将另一个存储过程中的上述存储过程作为SQL Server任务调用大约6个月而没有任何错误或问题.最近,我创建了一个新的存储过程,我们称之为'ABC',它调用一个调用MAKE_FUTURE_DATEs的存储过程.

4 - 这是我要解决的部分.当ABC在后台调用作为SQL Server任务时(通过SQL Server作业调度程序),它每次都会抛出错误(这是每天)并且结果不会生成/它崩溃.当我第一次启动SQL Server Management Studio并运行ABC时,它有时会在第一次引发错误.此序列中的第二次以及随后的所有时间都不会引发错误.另外,请记住,已经调用MAKE_FUTURE_DATES 6个月的存储过程仍然非常满意,没有错误.

我正在寻找有关如何调试此内容或查找内容的建议.特别是它有时会抛出错误而不是其他错误?

Phi*_*ler 8

您发布的代码对我来说很好.这是完整的代码吗?

我唯一想到的是你的"ABC"存储过程还有一个名为#TMP_DATES的临时表.然后,ABC中的临时表也可以在被调用的存储过程的范围内使用.

但是,如果是这种情况,则CREATE TABLE #TMP_DATES在调用被调用过程时应该会出现不同的错误.