Domanda

I've had a look around the forum and I can't find anything that fits my question exactly. This query is supposed to add recurring holidays for employees. If I exclude the PL_ID variable and just have a table with no primary key, the code adds in the correct days holiday defined in the case statement, this is on a test table but needs to be added to a table with over 25,000 entries.

The table includes PL_ID, Log_Date, Out_Time, In_Time

I currently have this code:

DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
DECLARE @DateVar DateTime
DECLARE @PL_ID int

SET @StartDate = '1/10/2012'
SET @EndDate = '1/11/2012'
SET @DateVar = @StartDate
SET @PL_ID = 0

WHILE @DateVar <= @EndDate

BEGIN 
 INSERT INTO Logger_test2(PL_ID,Log_Date,In_Time,Out_Time)
 SELECT @PL_ID,@DateVar,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '9'
             WHEN DATENAME(dw,@DateVar) = 'Monday' THEN '12'
         END AS In_Time,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN 'After 5'
             WHEN DATENAME(dw,@DateVar) = 'Monday' THEN 'After 5'
         END AS Out_Time      
  WHERE DATENAME(dw,@DateVar) IN ('Thursday','Monday')

 SET @DateVar = DATEADD(d,1,@DateVar)
 UPDATE Logger_test2 set @PL_ID = PL_ID = @PL_ID +1
 END

With this code, it only adds one row into the table with the greatest PL_ID but I need it to create a new ID for each entry, sorry it's a bit vauge. Would really appreciate your help though!

much closer to getting it right now! however if i change the date to the next month following i get duplicate key errors: Msg 2627, Level 14, State 1, Line 15 Violation of PRIMARY KEY constraint 'PK_Logger_test2'. Cannot insert duplicate key in object 'dbo.Logger_test2'. The duplicate key value is (4) - is there another way around this so that it does not try to insert duplicate keys?

SOLVED: here is the completed code :), worked a charm and made my life alot easier! inputted everyones pre-planned holiday for the next year just by just by changing the userID:

DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
DECLARE @DateVar DateTime
DECLARE @PL_ID int
DECLARE @User_ID int
DECLARE @Reason nvarchar(50)
DECLARE @Details nvarchar (500)

SET @StartDate = '30/09/2012'
SET @EndDate = '24/12/2012'
SET @DateVar = @StartDate
SET @User_ID = 55
SET @Reason = 'Day off'
SET @Details = 'Day off' 

--SET @PL_ID = 0
SELECT @PL_ID = max(PL_ID) from People_Logger

WHILE @DateVar <= @EndDate

BEGIN
 select @PL_ID = @PL_ID +1
 SET IDENTITY_INSERT dbo.People_logger ON;
 INSERT INTO People_Logger(PL_ID,LOG_Date,User_ID,Reason,Details,In_Time,Out_Time)
 SELECT @PL_ID,@DateVar,@User_ID,@Reason,@Details,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN 'After 5'
             WHEN DATENAME(dw,@DateVar) = 'Friday' THEN 'After 5'
         END AS In_Time,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '9'
             WHEN DATENAME(dw,@DateVar) = 'Friday' THEN '9'
         END AS Out_Time
  WHERE DATENAME(dw,@DateVar) IN ('Thursday','Friday')
SET IDENTITY_INSERT dbo.People_Logger OFF; 
 SET @DateVar = DATEADD(d,1,@DateVar)
END
È stato utile?

Soluzione

OK I think you just need to increment the value of your variable before you insert. Like this

WHILE @DateVar <= @EndDate
BEGIN

  select @PL_ID = @PL_ID + 1

  INSERT INTO Logger_test2(PL_ID,Log_Date,In_Time,Out_Time)
  SELECT @PL_ID,@DateVar,
  etc etc

  Set @DateVar= DATEADD(d,1,@DateVar)
  -- NO Update statement
END

Altri suggerimenti

DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
DECLARE @DateVar DateTime
DECLARE @PL_ID int

SET @StartDate = '1/10/2012'
SET @EndDate = '1/11/2012'
SET @DateVar = @StartDate
SET @PL_ID = 0

WHILE @DateVar <= @EndDate

BEGIN 
 INSERT INTO Logger_test2(PL_ID,Log_Date,In_Time,Out_Time)
 SELECT @PL_ID,@DateVar,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '9'
             WHEN DATENAME(dw,@DateVar) = 'Monday' THEN '12'
         END AS In_Time,
        CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN 'After 5'
             WHEN DATENAME(dw,@DateVar) = 'Monday' THEN 'After 5'
         END AS Out_Time      
  WHERE DATENAME(dw,@DateVar) IN ('Thursday','Monday')

 SET @DateVar = DATEADD(d,1,@DateVar)
 SET @PL_ID = @PL_ID +1
 END
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top