2013-05-16 25 views
6

próbuję wykonać następujący kod SQL 2008 ona mówi, że nie jest to problem w pobliżu „=” i „inny” ... nie mogę zrozumieć, co jest nie tak z kodemT-SQL, jeśli błąd oświadczenie

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

jeżeli składnia jest jak w wyrocznię, nie brakuje „a następnie” i „endif” – desperateCoder

+0

@MartinSmith Czy istnieje narzędzie do formatowania kodu SQL jak powyżej? Jeśli tak, możesz podać link. – Santosh

+2

Nie będzie można przypisać zmiennej wewnątrz 'EXISTS (SELECT'. @Santosh Używam SQL Pretty Printer. Wersja online jest tutaj http://www.dpriver.com/pp/sqlformat.htm –

Odpowiedz

2

Zamiast próbować przypisać do parametrów wyjściowych wewnątrz EXISTS wykonać zadanie następnie sprawdzić @@rowcount, aby sprawdzić, czy znaleziono pasujące wiersze.

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

to jest to ... dzięki człowiekowi – iceDragon

+1

@iceDragon - Możesz chcieć użyć 'IF @@ ROWCOUNT = 1' zamiast' IF @@ ROWCOUNT> 0' Po prostu użyłem drugiego, aby zachować jak najdalej, jaka byłaby pierwotna semantyka z 'EXISTS'. –

+0

Tak, będzie jeszcze lepiej ... wielkie dzięki – iceDragon

0

można przenieść IF EXISTS po BEGIN

+0

nic się nie zmieniło: S – iceDragon

0

Spróbuj to:

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

to nie ma wpływu na wynik: S – iceDragon

0

Zmień

SELECT @emp_id = emp_id, 
         @emp_name = emp_name_ara 

do

SELECT emp_id, emp_name_ara 

Dołącz @emp_id i @emp_name zmienne 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

, ale muszę przypisać te wartości do zmiennych wyjściowych – iceDragon

+0

Nie używam zmienne do testowania wartości, potrzebuję wartości zwrotnej za ich pośrednictwem – iceDragon