表变量 - 范围错误 - 必须声明变量“X”

Dea*_*ell 4 sql-server-2000

这是我的第一篇文章,不知道如何修复这个自动格式草稿?使用 SQL Server 2000。给我这个错误的表变量是“@SBLH”以下是产生此错误的多选函数:

USE [OfficeData]
GO
SET NOCOUNT ON
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[WC_Period_Wage_Class]
(   
    @StartPED datetime, 
    @EndPED datetime,
    @StartPeriod datetime, 
    @EndPeriod datetime
)

RETURNS

@WcWages    TABLE   (
                    WorkDate datetime,
                    PED datetime,
                    Amount5213 money,
                    Amount5221 money,
                    Amount8810 money,
                    AmountOther money,
                    Reason nvarchar(50),
                    Reportable int
                    )
AS
BEGIN
DECLARE @SBLH TABLE (
                    Project nvarchar(10),
                    EmplID int,
                    Phase nvarchar(5),
                    Cost nvarchar(5),
                    Type nvarchar(2),
                    Amount money,
                    PayED datetime,
                    WkDate datetime,
                    RunTotal money
                    )

INSERT INTO @SBLH   (
                    Project,
                    EmplID,
                    Phase,
                    Cost,
                    Type,
                    Amount,
                    PayED,
                    WkDate
                    )

SELECT  job,
        emp,
        phs,
        cst,
        ty,
        Sum(glamt) AS Amt,
        payend_dt, 
        CASE
            WHEN Cast(day1 AS int) > 0  THEN DATEADD(d, -6, payend_dt)
            WHEN Cast(day2 AS int) > 0  THEN DATEADD(d, -5, payend_dt)
            WHEN Cast(day3 AS int) > 0  THEN DATEADD(d, -4, payend_dt)
            WHEN Cast(day4 AS int) > 0  THEN DATEADD(d, -3, payend_dt)
            WHEN Cast(day5 AS int) > 0  THEN DATEADD(d, -2, payend_dt)
            WHEN Cast(day6 AS int) > 0  THEN DATEADD(d, -1, payend_dt)
            WHEN Cast(day7 AS int) > 0  THEN payend_dt
                                        ELSE DATEADD(d, -2, payend_dt)
        END AS WDate

FROM    SB_PRLaborHist

WHERE   (co = '1') AND
        (glamt > 0)

GROUP BY    job,
            emp,
            phs,
            cst,
            ty,
            payend_dt,
            CASE
                WHEN Cast(day1 AS int) > 0 THEN DATEADD(d, -6, payend_dt)
                WHEN Cast(day2 AS int) > 0 THEN DATEADD(d, -5, payend_dt)
                WHEN Cast(day3 AS int) > 0 THEN DATEADD(d, -4, payend_dt)
                WHEN Cast(day4 AS int) > 0 THEN DATEADD(d, -3, payend_dt)
                WHEN Cast(day5 AS int) > 0 THEN DATEADD(d, -2, payend_dt)
                WHEN Cast(day6 AS int) > 0 THEN DATEADD(d, -1, payend_dt)
                WHEN Cast(day7 AS int) > 0 THEN payend_dt
                                           ELSE DATEADD(d, -2, payend_dt)
            END

HAVING  (payend_dt Between @StartPED And @EndPED)

ORDER BY    emp,
            WDate

-- Update the temporary table #EBLH with a running total reset for each employee

DECLARE @RunTotal   money,
        @EID        int

SET @RunTotal = 0
SET @EID = 0

UPDATE @SBLH

SET @RunTotal = RunTotal = CASE
                           WHEN EmplID = @EID
                           THEN @RunTotal + Amount
                           ELSE Amount
                           END,
    @EID = EmplID

-- Remove wages above the $36,000 cap and compile into the three WC classes
-- Error is caused by the following code:

INSERT INTO @WcWages    (
                        WorkDate,
                        PED,
                        Amount5221,
                        Amount5213,
                        Amount8810,
                        AmountOther,
                        Reason,
                        Reportable
                        )

SELECT  WkDate,
        PayED,
        Sum(CASE
            WHEN JC.JC_WC_Class_Code = '5221'
            THEN Amount
            ELSE 0
            END) AS Amt5221,
        Sum(CASE
            WHEN JC.JC_WC_Class_Code = '5213'
            THEN Amount
            ELSE 0
            END) AS Amt5213,
        Sum(CASE
            WHEN JC.JC_WC_Class_Code = '8810'
            THEN Amount
            ELSE 0
            END) AS Amt8810,
        Sum(CASE
            WHEN Len(JC.JC_WC_Class_Code) = 0
            THEN Amount
            ELSE 0
            END) AS AmtOther,
        CASE
            WHEN Len(JC.JC_WC_Class_Code) > 0
            THEN ''
            ELSE JC.JC_Phase_Descrip + '-' + JC.JC_Cost_Descrip
        END AS OtherReason,
        CASE
            WHEN RunTotal > 36000.00
            THEN 0
            ELSE 1
        END AS IsReportable

FROM   @SBLH

        LEFT JOIN JC_D_CodeMaster AS JC
               ON @SBLH.Type = JC.JC_Cost_Type
              AND @SBLH.Cost = JC.JC_Cost_No
              AND @SBLH.Phase = JC.JC_Phase_No
              AND @SBLH.Project = JC.Project_Number

        LEFT JOIN JC_D_List_WC_Codes AS WC
               ON JC.JC_WC_Class_Code = WC.JC_WC_Class_Code

GROUP BY    @SBLH.WkDate,
            @SBLH.PayED,
            CASE
                WHEN Len(JC.JC_WC_Class_Code) > 0
                THEN '' 
                ELSE JC.JC_Phase_Descrip + '-' + JC.JC_Cost_Descrip
            END,
            CASE
                WHEN RunTotal > 36000.00
                THEN 0
                ELSE 1
            END

HAVING  (@SBLH.WkDate Between @StartPeriod And @EndPeriod)

RETURN
END
GO
Run Code Online (Sandbox Code Playgroud)

错误是更新代码后的插入代码。这应该是一批,变量@SBLH 不应超出范围。我在互联网上发现在更新后对变量的引用失去了它的范围。但是,我已经看到 MS 知识库示例显示了在类似于我上面的代码的多选择函数中的更新语句之后的选择语句中使用的表变量。我知道这很简单,但它让我望而却步。这是我写的第一个多选函数,所以请耐心等待。

感谢所有的帮助。

Aar*_*and 7

您不能在 join/where 子句中使用表变量名称作为列前缀,您需要执行以下操作:

FROM @slbh AS slbh
...
ON slbh.col = ...
Run Code Online (Sandbox Code Playgroud)

  • @DeanLavell 如果 Aaron 的回答解决了您的问题,您可以通过单击他的回答分数下方的复选标记将其标记为已接受的解决方案。 (2认同)