2013-05-16 10 views
6

sto cercando di eseguire il seguente codice SQL 2008 si dice che c'è un problema vicino "=" e "altro" ... Non riesco a capire cosa c'è di sbagliato con il codiceT-SQL in caso di errore dichiarazione

ALTER PROCEDURE dbo.LoginEmp @username NVARCHAR(10), 
          @password NVARCHAR(10), 
          @confirm INT output, 
          @emp_name NVARCHAR(50) output, 
          @emp_id BIGINT output 
AS 
    IF EXISTS (SELECT @emp_id = emp_id, 
         @emp_name = emp_name_ara 
       FROM Employee 
       WHERE (emp_username LIKE @username 
         AND emp_password LIKE @password)) 
     BEGIN 
      SET @confirm=1 

      INSERT INTO EmployeeLog 
         (log_emp_id, 
         log_act_id, 
         log_date, 
         log_data) 
      VALUES  (@emp_id, 
         1, 
         GETDATE(), 
         -1) 
     END 
    ELSE 
     BEGIN 
      SET @confirm=0 
     END 

    RETURN 
+0

se la sintassi è come in Oracle, ci manca "poi" e "endif" – desperateCoder

+0

@MartinSmith C'è qualche strumento per formattare il codice SQL come sopra? Se sì, puoi fornire il link. – Santosh

+2

Non è possibile assegnare una variabile all'interno di 'EXISTS (SELECT'. @Santosh Uso SQL Pretty Printer. Una versione online è qui http://www.dpriver.com/pp/sqlformat.htm –

risposta

2

Invece di cercare di assegnare ai parametri di uscita all'interno del EXISTS fare l'assegnazione quindi controllare @@rowcount per vedere se sono state trovate delle righe corrispondenti.

ALTER PROCEDURE dbo.LoginEmp @username NVARCHAR(10), 
          @password NVARCHAR(10), 
          @confirm INT output, 
          @emp_name NVARCHAR(50) output, 
          @emp_id BIGINT output 
AS 
    SELECT @emp_id = emp_id, 
      @emp_name = emp_name_ara 
    FROM Employee 
    WHERE (emp_username = @username 
      AND emp_password = @password) 

    IF @@ROWCOUNT = 1 
     BEGIN 
      SET @confirm=1 

      INSERT INTO EmployeeLog 
         (log_emp_id, 
         log_act_id, 
         log_date, 
         log_data) 
      VALUES  (@emp_id, 
         1, 
         GETDATE(), 
         -1) 
     END 
    ELSE 
     BEGIN 
      SET @confirm=0 
     END 
+0

che è ... grazie uomo – iceDragon

+1

@iceDragon - Potresti voler usare 'IF @@ ROWCOUNT = 1' invece di' IF @@ ROWCOUNT> 0' Ho appena usato il secondo per preservare il più possibile ciò che sarebbe stata la semantica originale con 'EXISTS'. –

+0

Sì, sarà ancora meglio ... molte grazie – iceDragon

0

Riesci a muovere IF EXISTS dopo BEGIN

+0

nulla cambiato: S – iceDragon

0

Try This:

ALTER PROCEDURE dbo.LoginEmp 
@username nvarchar(10), 
@password nvarchar(10), 
@confirm int output, 
@emp_name nvarchar(50) output, 
@emp_id bigint output 
AS 
Begin 
if exists (SELECT emp_id, emp_name_ara FROM Employee WHERE  (emp_username LIKE @username AND emp_password LIKE @password)) begin 
    // Here Retrieve the Data into Variable again. Like You did Above Before. 
set @confirm=1 

INSERT INTO EmployeeLog (log_emp_id,log_act_id,log_date,log_data) VALUES (@emp_id,1,GETDATE(),-1) 

end 
else begin 

set @confirm=0 
end 
end 
RETURN 
+0

non ha alcun effetto sul risultato: S – iceDragon

0

Change

SELECT @emp_id = emp_id, 
         @emp_name = emp_name_ara 

a

SELECT emp_id, emp_name_ara 

accodamento @emp_id e @emp_name variabili WHERE

IF EXISTS (SELECT emp_id, emp_name_ara 
       FROM Employee 
       WHERE (emp_username LIKE @username 
         AND emp_password LIKE @password AND [email protected]_id AND emp_name_ara = @emp_name )) 
+0

ma ho bisogno di assegnare quei valori alle variabili di uscita – iceDragon

+0

non sto usando le variabili per testare un valore, ho bisogno di un valore di ritorno attraverso di loro – iceDragon

1

Exists controlla se una riga presente nel set di risultati è stata restituita dalla query. Nell'esempio si assegna semplicemente i valori alla variabile. Per ulteriori riferimento si prega di controllare questo link: Assigning a variable inside an IF EXISTS clause

Problemi correlati