我编写了一个存储过程来将未来的日期(不包括周六和周日)插入到一个永久表中。该例程仅使用一个临时表。这篇文章的目的不是批评存储过程。虽然,我确信它可以改进。然而,这篇文章的目的是分析为什么存储过程在一组情况下而不是其他情况下调用时会抛出这些错误。
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'.
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
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 个月的存储过程仍然很满意,没有错误。
我正在寻找有关如何调试或寻找什么的建议。特别是它如何有时会抛出错误而不是其他错误?