'Ungültiger Spaltenname' aus einer gespeicherten Prozedur

Ich habe eine gespeicherte Prozedur geschrieben, um zukünftige Termine (ohne Sat und Sun) in eine permanente Tabelle einzufügen. Die Routine verwendet nur eine Temp-Tabelle. Der Zweck dieses Beitrags ist nicht, das gespeicherte Verfahren zu kritisieren. Obwohl ich sicher bin, dass es verbessert werden könnte. Allerdings ist der Zweck dieser Post zu parsing, warum die gespeicherte Prozedur ist casting diese Fehler, wenn unter einem Satz von Umständen und nicht anderen aufgerufen.

1 – Hier sind die Fehler, die ich erhalten habe

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 – Hier ist die gespeicherte Prozedur

 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 – Ich habe die oben gespeicherte Prozedur innerhalb einer anderen gespeicherten Prozedur als SQL server Aufgabe im background (über den SQL server Job Scheduler) für ca. 6 Monate ohne Fehler oder Probleme aufgerufen. Vor kurzem habe ich eine neue gespeicherte Prozedur erstellt, nennen wir es 'ABC', das eine gespeicherte Prozedur aufruft, die MAKE_FUTURE_DATEs aufruft.

4 – Hier ist der Teil, den ich zu lösen versuche. Wenn ABC als SQL server-Task im background (über den SQL server-Job Scheduler) aufgerufen wird, wirft er die Fehler jedes Mal (das ist täglich) und die Ergebnisse werden nicht produziert / es stürzt ab. Wenn ich zum ersten Mal starten SQL server Management Studio und führen ABC es manchmal wirft den Fehler das erste Mal. Das zweite Mal in dieser Sequenz und alle nachfolgenden timeen wirft den Fehler nicht auf Beachten Sie auch, dass die gespeicherte Prozedur, die seit 6 Monaten MAKE_FUTURE_DATES aufgerufen hat, immer noch sehr glücklich ist.

Ich bin auf der search nach Anregungen, wie man dies zu debuggen oder was zu suchen. Vor allem, wie kann es den Fehler manchmal und nicht andere casting?

Der Code, den du gepostet hast, sieht mir gut aus. Ist das der komplette Code?

Das einzige, was in den Sinn kommt, ist, dass Ihre "ABC" gespeicherte Prozedur auch eine Temp-Tabelle namens #TMP_DATES hat. Die temp-Tabelle in ABC wäre dann auch im Rahmen der aufgerufenen gespeicherten Prozedur verfügbar.

Allerdings, wenn das der Fall wäre, sollten Sie einen anderen Fehler erhalten, wenn Sie CREATE TABLE #TMP_DATES in der aufgerufenen Prozedur aufgerufen haben.

Temp-Tabellen haben einen scope größer als nur ein Verfahren.

So können Sie eine temp-Tabelle in uspProc1 erstellen … und wenn in uspProc1, rufen Sie uspProc2, uspProc2 "kann sehen" die Temp-Tabelle, die Sie erstellt haben.

Stellen Sie sicher, dass Sie Ihren #temp-Tabellen eindeutige Namen geben.

Unten ist ein Beispiel, das den Punkt zeigt.

 IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' and ROUTINE_NAME = N'uspProc001' ) BEGIN DROP PROCEDURE [dbo].[uspProc001] END GO CREATE Procedure dbo.uspProc001 ( @Param1 int ) AS BEGIN IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL begin drop table #TableOne end CREATE TABLE #TableOne ( SurrogateKey int , NameOf varchar(12) ) Insert into #TableOne ( SurrogateKey , NameOf ) select 1001, 'uspProc001' Select * from #TableOne EXEC dbo.uspProc002 Select * from #TableOne IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL begin drop table #TableOne end END GO IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' and ROUTINE_NAME = N'uspProc002' ) BEGIN DROP PROCEDURE [dbo].[uspProc002] END GO CREATE Procedure dbo.uspProc002 AS BEGIN IF OBJECT_ID('tempdb..#TableOne') IS NOT NULL begin Insert into #TableOne ( SurrogateKey , NameOf ) select 2001, 'uspProc002' end END GO exec dbo.uspProc001 0