这是我的第一篇文章,不知道如何修复这个自动格式草稿?使用 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 知识库示例显示了在类似于我上面的代码的多选择函数中的更新语句之后的选择语句中使用的表变量。我知道这很简单,但它让我望而却步。这是我写的第一个多选函数,所以请耐心等待。
感谢所有的帮助。
您不能在 join/where 子句中使用表变量名称作为列前缀,您需要执行以下操作:
FROM @slbh AS slbh
...
ON slbh.col = ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2290 次 |
| 最近记录: |