2012-02-09 4 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 –

답변

1

데이터베이스의 호환성 수준을 확인하십시오. 나는 그것이 잘 작동 기본 테이블에 대한 모든 참조를 제거하면 나는 2008 2000 또는 2005으로 설정하여이 오류를 재현 할 수

합니다 (MERGE 문은 세미콜론으로 종료 할 필요가 있지만.)

+0

정확합니다. SP는 SQL 2000 호환 db에서 실행되었습니다. 나는 모두가 제안한 것처럼 세미 콜론을 추가했다. 나는 그들을 선호한다. 테이블을 임시 테이블로 설정하여 외부 보고서를 실행 한 후에 제거 할 수 있습니다. 영구 테이블에 넣고 다음 실행 때까지 데이터를 남겨 둘 것을 고려 중입니다. – kereberos

1

the documentation은 #temp 또는 ## global temp 테이블에 대해 명시 적으로 언급하지 않는 반면, 나는 이것을 사용하는 MERGE 예제를 본 적이 없습니다. 아마도 MERGE ##HoursByDayMERGE INTO ##HoursByDay이어야하기 때문일 것입니다. 이전 문장이 세미콜론으로 제대로 종료되지 않았기 때문일 수 있습니다. 내가 지금 시험 할 수있는 곳이 아니라, 나는 그것들을 시도 할 것이다.

어쨌든 영구 테이블을 사용하지 않으시겠습니까? 당신이 마지막에 그것을 버릴 필요가 없다는 것 외에도 ## 전역 temp 테이블과 동일한 동시성과 격리를 달성합니다. 나는 세계 임시 직원이 당신을 여기에서 사는지 이해하지 못합니다.

관련 문제