Почему это недопустимый столбец в хранимых процедурах SQL?

#sql #sql-server-2008

#sql #sql-server-2008

Вопрос:

У меня есть следующая хранимая процедура SQL, которая, когда я пытаюсь ее сохранить, выдает сообщение о «Недопустимом имени столбца ‘Goal'» в последнем операторе select.

Может кто-нибудь сказать мне, почему это недопустимое имя comlumn? Я делаю в основном то же самое для NetSales, и он не жалуется на этот столбец.

 if object_id('tempdb..#tmpHours') is not null
    DROP TABLE #tmpHours
if object_id('tempdb..#tmpPay') is not null
    DROP TABLE #tmpPay

SET @MondayOfCurrentWeek = (SELECT DATEADD(wk, DATEDIFF(wk,0,@WeekOf), 0) )

SELECT  p.PerceptionistID AS PerceptionistID, p.BaseCommission AS BaseCommission, p.BonusCommission AS BonusCommission, 
        h.WeekOf AS WeekOf, h.WorkHours AS WorkHours, h.PTOHours AS PTOHours, h.HolidayHours AS HolidayHours,
        ROUND(h.WorkHours, 0) AS HoursRounded, 
        (
            SELECT COUNT(c.PerceptionistID)
            FROM T_Call c 
            WHERE 
                c.PerceptionistID = p.PerceptionistID 
                AND c.OutcomeID = @OutcomeSale 
                AND EnteredOn BETWEEN @MondayOfCurrentWeek AND DATEADD(dd, 7, @MondayOfCurrentWeek)
        ) AS GrossSales,
        (
            SELECT COUNT (c.PerceptionistID)
            FROM T_CallCredit cc
                INNER JOIN T_Call c
                    ON cc.CallID = c.CallID
            WHERE 
                c.PerceptionistID = p.PerceptionistID 
                AND cc.CallCreditStatusID NOT IN (17, 18)  -- 17 - 'Error in Customer Account', 18 - 'Courtesy Credit'
                AND cc.EnteredOn BETWEEN @MondayOfCurrentWeek AND DATEADD(dd, 7, @MondayOfCurrentWeek)
        ) AS Credits

INTO #tmpHours
FROM T_Perceptionist p
    RIGHT JOIN T_PerceptionistHours h
        ON p.PerceptionistID = h.PerceptionistID
WHERE h.WeekOf = @MondayOfCurrentWeek


SELECT  PerceptionistID, CAST((HoursRounded*2) AS int) AS Goal, GrossSales, Credits, (GrossSales - Credits) AS NetSales, 
        HoursRounded, WorkHours, PTOHours, HolidayHours, BaseCommission, BonusCommission, 
        [dbo].fnCalculateCommission(BaseCommission, BonusCommission, (GrossSales - Credits), CAST((HoursRounded*2) AS int)) AS CommissionPay
INTO #tmpPay    
FROM #tmpHours 


--- Complains about column name 'Goal' in the following statement
SELECT  PerceptionistID, Goal, GrossSales, Credits, NetSales, HoursRounded, WorkHours, PTOHours, 
        HolidayHours, BaseCommission, BonusCommission, CommissionPay
FROM #tmpPay
  

Ответ №1:

Попробуйте запустить его в новом соединении или сначала удалить временные таблицы в отдельном пакете.

Возможно #temp , таблицы все еще хранятся в предыдущем пакете, когда у вас не было Goal столбца, и анализатор проверяет имена столбцов на соответствие существующей таблице, обнаруживает ошибку привязки и отказывается запускать пакет.

Если временные таблицы вообще не существуют, компиляция инструкции будет отложена.