2012-02-09 104 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?也許是因爲前面的陳述沒有用分號恰當地結束?不在我現在可以測試的地方,但我會嘗試這些。

無論如何,你爲什麼不使用永久表?除了最後不必刪除它之外,它可以實現與##全局臨時表相同的併發和隔離。我不明白全球臨時表在這裏買你什麼。