2012-02-09 14 views
1

ストアドプロシージャに問題があります。私はテーブルvarからグローバルtempテーブルにデータをマージしようとしています。私はマージ後にテーブル名を入れるとすぐにエラーになります。これを初めて使用しようとしています。マージをコメントアウトすると、すべてが機能します。グローバル温度テーブルでマージを使用

誰が問題を認識していますか?

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

データベースの互換性レベルを確認してください。

MERGE文はセミコロンで終了する必要がありますけれども。)私はあなたのベーステーブルへの参照をすべて削除したら、それは正常に動作します2008年2000または2005に設定することで、このエラーを再現することができ

+0

あなたは正しいです。 SPはSQL 2000互換のデータベースで実行されていました。みんなのようにセミコロンを追加しました。とにかく私はそれらを好む。私は一時テーブルとして設定されたテーブルを持っているので、それに対して外部のレポートが実行された後に削除することができます。私はそれを永続的なテーブルに入れ、次の実行までデータを残すことを検討しています。 – kereberos

1

the documentationは#tempテーブルまたは## global tempテーブルに対して明示的には指定されていないようですが、これを使用する例は一度もありませんでした(MERGE)。おそらくそれはMERGE ##HoursByDayMERGE INTO ##HoursByDayになるはずですか?前のステートメントがセミコロンで正しく終了していない可能性がありますか?私が今テストできる場所ではないが、私はそれらを試してみるだろう。

いずれにしても、永久テーブルを使用しないのはなぜですか。最終的に削除する必要はありませんが、##グローバルtempテーブルと同じ並行性と分離性を実現します。私は、グローバルな一時テーブルがここであなたを買っているのか分かりません。

関連する問題