Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    162

    Insert in sql server 2005

    Salve, come detto rieccomi qui con i soliti problemi, che grazie al Vostro aiuto oltre a risolverli, mi stanno dando un aiuto veramente importante per la creascita professionale in questo campo.

    Ho delle tabelle che sono relazionate (leaverequest) con la tabella (Employee) uno ad uno.

    La mia store deve inserire nella tabella leaverequest tutti gli elementi che non esistono nel parametro della store @IDuser

    codice:
    ALTER PROCEDURE [dbo].[spferieinsert]
    (@idUser Int, @startDateIn varchar(14))
    AS
    BEGIN
    	
    	SET NOCOUNT ON;
    	IF @startDateIn = '' 
    		SET @startDateIn=CONVERT(varchar(4), Year(GetDate())) +  '0101000000'
    	DECLARE @maxReachableLeaves Float
    	DECLARE @daysAvailable Int
    	DECLARE @lastDayDate DateTime
    	DECLARE @newRange Float
    	DECLARE @firstEmptyLeaveId Int
    	DECLARE @startDate DateTime
        DECLARE @leavetype INT
        DECLARE @esiste varchar
    
        SET @leavetype=2
    
    	SET @startDate = dbo.StringToData(@startDateIn)
    
    	SELECT @maxReachableLeaves = leaMaxReachable
    	FROM dbo.leaveType
    	WHERE IDLeaveType=@leaveType --VALORE PER FERIE	
    	
    	
    	SET @lastDayDate=dbo.StringToData(
    							CONVERT(varchar(4), Year(GetDate())) + 
    							'1231000000' )
    	
    	
    	SET @newRange=DATEDIFF(day, @startDate, @lastDayDate)
    	
    	
    	SET @daysAvailable= @newRange*(@maxReachableLeaves/365.00) + 1
    
    
    
    
    
    	--SELECT daysAvailable=@daysAvailable
    
    SELECT @firstEmptyLeaveId = ISNULL(MAX(Lea.IDLeaveRequest),0) + 1 FROM [dbo].[leaveRequest]Lea
    
    
    INSERT INTO [BSPF_GLOB].[dbo].[leaveRequest]
    SELECT @firstEmptyLeaveId,@idUser,@leaveType,@startDate,@lastDayDate,0,0.0,Lea.leaReason,Em.ADDRESS,
    Em.MOBILE,0,@idUser,10,'Nuova Assunzione',GetDate(),@idUser,GetDate(),@idUser FROM leaveRequest Lea 
    INNER JOIN 
    EMPLOYEE Em ON Lea.IDUser = Em.ID
    WHERE (SELECT COUNT(*) FROM leaveRequest WHERE Lea.IDUser = @IDUser)>0
    Il problema è che non me lo inserisce(i campi sono perfettamente), anzi mi inserisce quello che c'è

    Dove sbaglio?

    Grazie ancora

  2. #2
    non devi usare una INNER JOIN (emergono solo le condizioni soddisfatte) ma una LEFT JOIN e prelevare solo quelli dove il campo di JOIN nella tabella di destra è NULL

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    162
    Ciao optime, grazie per il tuo intervento, ho seguito il tuo consiglio e ho inserito la clausola Left Join e poi ho messo
    EMPLOYEE Em ON Lea.IDUser = NULL

    impostando l'id user della tabella di destra a null.

    Il problema è che nel caso non ci siano i valori allora l'inserisce, ma nel caso ci siano mi dà errore sulla chiave primaria che dice che è violata, ma la chiave primaria se tu vedi nel post iniziato da me, la creo io, visto che non è identity,prendendo il max dell'idleaverequest e gli assegno uno, ma l'Iduser in questione non è chiave primaria, hai idea da cosa potrebbe essere creato questo errore?

    Intanto vado a sbatterci ancora un pò la testa.

    Grazie ancora del tuo prezioso aiuto!

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    162
    Non sono molto pratico di sql in effetti, se però mi fate capire dove sbaglio...Purtroppo non sono riuscito a caspire bene la risposta di optime.

    Grazie ancora

  5. #5
    il valore NULL lo devi considerare nella WHERE, non nella JOIN!

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    162
    Innanzitutto , grazie per non avermi abbandonato!

    LEFT JOIN
    EMPLOYEE Em ON Lea.IDUser = Em.ID
    WHERE Lea.IDUser = NULL AND Em.ID = @idUser (parametro della sp)

    Adesso ho capito bene?

    Oppure sono proprio tonto

    Grazie comunque di tutto!

  7. #7
    facciamo a capirci

    hai due tabelle

    quella piena è TabA e quella semipiena è TabB

    farai ...

    TabA left join TabB on TabA.id=TabB.id

    così ti prende TUTTI quelli di TabA (che è la tabella piena) e quelli di TabB che corrispondono; nelle righe che NON corrispondono, i campi di TabA saranno pieni, quelli di TabB conterranno NULL (cos'altro potrebbe metterci il povero sql??)

    sfruttando questo comportamento, per capire quali sono quelli che mancano nella 'semivuota', ti basterà selezionare...

    where TabB.id is null

    adattalo al tuo caso

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    162
    Allora io l'ho fatta così

    codice:
    INSERT INTO [BSPF_GLOB].[dbo].[leaveRequest]
    SELECT @firstEmptyLeaveId,Em.ID,@leavetype,@startDate,@lastDayDate,0,0.0,'ferie per motivi personale anno 2008',Em.ADDRESS,
    Em.MOBILE,0,Em.ID,10,'Nuova Assunzione',GetDate(),Em.ID,GetDate(),Em.ID FROM leaveRequest Lea 
    LEFT JOIN EMPLOYEE Em ON Lea.IDUser = Em.ID WHERE Em.ID = @idUser AND Lea.IDUser = NULL
    ma mi inserisce solo uno ma poi non ne inserisce più

    Se puoi continuare a darmi indicazioni per poterla risolvere...grazie ancora

  9. #9
    guarda che SQL fa quello che gli dici tu! gli hai Detto WHERE Em.ID = @idUser, che cosa ti aspetti?

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    162
    Grazie per la spiegazione che è stata veramente soddisfacente, così da prendere esmepio e costruire nuovamente la sp con le tue spiegazioni e nonostante l'abbia messa a punto come tu hai detto, non inserisce ugualmente i dati :

    [CODE]
    INSERT INTO [BSPF_GLOB].[dbo].[leaveRequest]
    SELECT @firstEmptyLeaveId,Em.ID,@leavetype,@startDate,@la stDayDate,0,0.0,'ferie per motivi personale anno 2008',Em.ADDRESS,
    Em.MOBILE,0,Em.ID,10,'Nuova Assunzione',GetDate(),Em.ID,GetDate(),Em.ID FROM EMPLOYEE Em
    LEFT JOIN leaveRequest Lea ON Lea.IDUser = Em.ID WHERE Em.ID = @idUser AND Lea.IDUser = NULL
    [CODE]

    Forse ti sarai già stancato e impazientito,cmq grazie di tutto se hai idea del perchè questa non funziona(partendo dal fatto che è identica alla tua spiegazione).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.