2012-02-09 98 views
1

我遇到了存储过程问题。我正在尝试将表var中的数据合并到全局临时表中。我在合并后将表名称放入时出现错误。这是我第一次尝试使用它。如果我评论合并,一切正常。使用与全局临时表合并

有没有人知道问题在哪里?

USE [MONDAT] 
GO 
/****** Object: StoredProcedure [dbo].[Pickrate] Script Date: 02/08/2012 16:12:54 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  <Author,,Name> 
-- Create date: <Create Date,,> 
-- Description: <Description,,> 
-- ============================================= 
ALTER PROCEDURE [dbo].[Pickrate] 
-- Add the parameters for the stored procedure here 
@ReportDate Date --= getdate 
--<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0> 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 

-- Create memory tables filled with the data we require to fille the temp table 
DECLARE @StartDate DATE 
DECLARE @EndDate DATE 
DECLARE @TrueReportDate DATE 
DECLARE @EmployeeRecords TABLE(EmployeeNumber CHAR(6), EmployeeName CHAR(30), OriginalHireDate DATE, Deptcode CHAR(6), DeptDesc CHAR(30), TeamNo CHAR(2), PayDate DATE, Hours NUMERIC) 
DECLARE @PickSummaries TABLE(EmployeeNumber CHAR(6), PayDate DATE, Lbs NUMERIC, PiecePay NUMERIC, Grade03Lbs NUMERIC, Grade02Lbs NUMERIC, Grade01Lbs NUMERIC) 

--drop temp table if it exists 
IF EXISTS (
    SELECT * 
    FROM tempdb..sysobjects 
    WHERE name LIKE '##HoursByDay%') 
    BEGIN 
     DROP TABLE ##HoursByDay 
    END 

--create temp table 
Create table ##HoursByDay (ID INT IDENTITY(1,1), 
          EmployeeNumber CHAR(6), 
          EmployeeName CHAR(30), 
          OriginalHireDate DATE, 
          DeptCode CHAR(6), 
          DeptDesc CHAR(30), 
          TeamNo CHAR(2), 
          PayDate DATE, 
          DailyPayHours NUMERIC, 
          DailyLbs NUMERIC, 
          DailyPiecePay NUMERIC, 
          DailyLbsPerHour NUMERIC, 
          DailyGrade01Lbs NUMERIC, 
          DailyGrade02Lbs NUMERIC, 
          DailyGrade03Lbs NUMERIC, 
          DailyGrade01Percent NUMERIC, 
          DailyGrade02Percent NUMERIC, 
          DailyGrade03Percent NUMERIC, 
          WeeklyPayHours NUMERIC, 
          WeeklyLbs NUMERIC, 
          WeeklyPiecePay NUMERIC, 
          WeeklyLbsPerHour NUMERIC, 
          WeeklyGrade01Lbs NUMERIC, 
          WeeklyGrade02Lbs NUMERIC, 
          WeeklyGrade03Lbs NUMERIC, 
          WeeklyGrade01Percent NUMERIC, 
          WeeklyGrade02Percent NUMERIC, 
          WeeklyGrade03Percent NUMERIC, 
          WeeklyRank NUMERIC) 

-- determine Period Start, Period End and True Report dates 
IF @ReportDate = CAST(GetDate() AS DATE) 
BEGIN 
    SET @TrueReportDate = DATEADD(d, -1, GetDate()) 
END 
ELSE 
BEGIN 
    SET @TrueReportDate = @ReportDate 
END 
SET @StartDate = DATEADD(day, - 1 - (DATEPART(dw, @TrueReportDate) + @@DATEFIRST - 1) % 7, @TrueReportDate)        
SET @EndDate = DATEADD(day, 6 -(DATEPART(dw, @TrueReportDate) + @@DATEFIRST) % 7, @TrueReportDate) 


-- fill the memory tables with data 
-- Gather data from the time and attendance system 
INSERT INTO @EmployeeRecords (EmployeeNumber, EmployeeName, OriginalHireDate, Deptcode, DeptDesc, TeamNo, PayDate, Hours) 
SELECT  EZTrack.dbo.hEmployee.EmployeeNumber, MAX(RTRIM(EZTrack.dbo.hEmployee.FirstName) + ' ' + RTRIM(EZTrack.dbo.hEmployee.LastName)) AS Name, MAX(EZTrack.dbo.hEmployee.OriginalHireDate) 
        AS OriginalHireDate, MAX(EZTrack.dbo.sOrganization.OrgCode) AS Deptcode, MAX(EZTrack.dbo.sOrganization.OrgDesc) AS DeptDesc, MAX(EZTrack.dbo.sOrganization.OrgCode) AS TeamNo, 
        EZTrack.dbo.tPunch.Chargedate AS PayDate, SUM(CAST(DATEDIFF(mi, EZTrack.dbo.tPunch.ID, EZTrack.dbo.tPunch.OD) AS numeric)/60) AS Hours 
FROM  EZTrack.dbo.tPunch INNER JOIN 
        EZTrack.dbo.hEmployee ON EZTrack.dbo.tPunch.EmployeeID = EZTrack.dbo.hEmployee.EmployeeID INNER JOIN 
        EZTrack.dbo.hEmployeeOrgs AS hEmployeeOrgs_1 ON EZTrack.dbo.hEmployee.EmployeeID = hEmployeeOrgs_1.EmployeeID INNER JOIN 
        EZTrack.dbo.sOrganization AS sOrganization_1 ON hEmployeeOrgs_1.Orglevel2ID = sOrganization_1.OrganizationID LEFT OUTER JOIN 
        EZTrack.dbo.sOrganization INNER JOIN 
        EZTrack.dbo.hEmployeeOrgs ON EZTrack.dbo.sOrganization.OrganizationID = EZTrack.dbo.hEmployeeOrgs.Orglevel6ID ON 
        EZTrack.dbo.hEmployee.EmployeeID = EZTrack.dbo.hEmployeeOrgs.EmployeeID 
WHERE  (EZTrack.dbo.hEmployee.Status = 1 and EZTrack.dbo.tPunch.Chargedate >= @StartDate and EZTrack.dbo.tPunch.Chargedate <= @EndDate) 
GROUP BY EZTrack.dbo.hEmployee.EmployeeNumber, EZTrack.dbo.tPunch.Chargedate 

-- Gather picking data from the harvesting database 
INSERT INTO @PickSummaries (EmployeeNumber, PayDate, Lbs, PiecePay, Grade03Lbs, Grade02Lbs, Grade01Lbs) 
SELECT  EmployeeID, BackDate AS PayDate, SUM(BoxCapacity) AS Lbs, SUM(Payrate) AS PiecePay, SUM(CASE WHEN Grade = '03' THEN BoxCapacity ELSE 0 END) 
        AS Grade03Lbs, SUM(CASE WHEN Grade = '02' THEN BoxCapacity ELSE 0 END) AS Grade02Lbs, SUM(CASE WHEN Grade = '01' THEN BoxCapacity ELSE 0 END) 
        AS Grade01Lbs 
FROM  STmush_30_Main.dbo._vTransData 
WHERE  BackDate >= @StartDate and BackDate <= @EndDate 
GROUP BY EmployeeID, BackDate 

----Place the harvester data into the global temp table 
INSERT INTO ##HoursByDay (EmployeeNumber, EmployeeName, OriginalHireDate, DeptCode, DeptDesc, TeamNo, PayDate) 
SELECT DISTINCT EmployeeNumber, EmployeeName, OriginalHireDate, DeptCode, DeptDesc, TeamNo, @TrueReportDate 
FROM @EmployeeRecords 

---- Merge the values from the hours query to the temp table 
--MERGE ##HoursByDay AS [target] 
--USING 
-- (SELECT C.EmployeeNumber, SUM(CAST(DATEDIFF(mi, EZTrack.dbo.tPunch.ID, EZTrack.dbo.tPunch.OD) AS numeric)/60) AS DailyPayHours 
-- FROM EZTrack.dbo.tPunch B INNER JOIN EZTrack.dbo.hEmployee C ON EZTrack.dbo.tPunch.EmployeeID = EZTrack.dbo.hEmployee.EmployeeID 
-- WHERE B.Chargedate = @TrueReportDate) as [source] 
--ON 
-- ([target].EmployeeNumber = [source].EmployeeNumber) 
--WHEN MATCHED 
-- THEN 
--  UPDATE SET 
--  [target].DailyPayHours = [source].DailyPayHours 


RETURN 0      

END

当我执行的SP,我得到一个错误 “消息102,级别15,状态1,过程Pickrate,109线 附近有语法错误## HoursByDay'。”

+1

漂亮确保在需要以分号结尾之前的陈述。您应该养成正确终止所有语句的习惯,因为最终将废弃分号将被废弃:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/09/03/ladies-and-gentlemen-start -your-semi-colons.aspx – 2012-02-09 16:52:11

回答

1

检查数据库的兼容性级别。

我可以将其设置为2000或2005年。2008年重现此错误,一旦我删除你的基表的所有引用它工作正常(虽然MERGE语句需要用分号来终止。)

+0

你是对的。 SP正在SQL 2000兼容的数据库中运行。我添加了像所有人建议的分号。无论如何,我更喜欢他们。我将表格设置为临时表格,以便在外部报告运行后将其删除。我正在考虑将它放入一张永久性表格中,并将数据留存至下一次运行。 – kereberos 2012-02-09 19:10:15

1

尽管the documentation似乎没有明确提及#temp或##全局临时表,但我从来没有见过使用它们的MERGE示例。也许是因为MERGE ##HoursByDay应该是MERGE INTO ##HoursByDay?也许是因为前面的陈述没有用分号恰当地结束?不在我现在可以测试的地方,但我会尝试这些。

无论如何,你为什么不使用永久表?除了最后不必删除它之外,它可以实现与##全局临时表相同的并发和隔离。我不明白全球临时表在这里买你什么。