2013-05-16 26 views
6

Tôi đang cố gắng thực thi mã SQL 2008 sau đây, nó có vấn đề gần "=" và "khác" ... tôi không thể hiểu điều gì sai với mãT-SQL nếu lỗi báo cáo

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

nếu cú ​​pháp giống như trong oracle, thiếu "then" và "endif" – desperateCoder

+0

@MartinSmith Có công cụ nào để định dạng mã SQL như trên không? Nếu có, bạn có thể cung cấp liên kết. – Santosh

+2

Bạn sẽ không thể gán một biến bên trong 'EXISTS (SELECT'. @Santosh I sử dụng SQL Pretty Printer. Một phiên bản trực tuyến có tại đây http://www.dpriver.com/pp/sqlformat.htm –

Trả lời

2

Thay vì cố gắng để gán cho các thông số đầu ra bên trong EXISTS làm nhiệm vụ sau đó kiểm tra @@rowcount để xem có bất kỳ hàng phù hợp nào được tìm thấy hay không.

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

đó là ... nhờ người đàn ông – iceDragon

+1

@iceDragon - Bạn cũng có thể muốn sử dụng 'IF @@ ROWCOUNT = 1' thay vì' IF @@ ROWCOUNT> 0' Tôi chỉ sử dụng thứ hai để bảo tồn càng nhiều càng tốt những gì các ngữ nghĩa ban đầu với 'EXISTS' sẽ có được. –

+0

Có nó sẽ còn tốt hơn ... cảm ơn nhiều – iceDragon

0

bạn có thể di chuyển IF EXISTS sau BEGIN

+0

không có gì thay đổi: S – iceDragon

0

Hãy thử này:

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

nó không ảnh hưởng đến kết quả: S – iceDragon

0

Thay đổi

SELECT @emp_id = emp_id, 
         @emp_name = emp_name_ara 

để

SELECT emp_id, emp_name_ara 

Nối @emp_id@emp_name biến mệnh đề 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

nhưng tôi cần gán giá trị đó cho biến đầu ra – iceDragon

+0

tôi không sử dụng các biến để kiểm tra một giá trị, tôi cần một giá trị trả về thông qua chúng – iceDragon

1

Toán tử tồn tại sẽ kiểm tra xem có bất kỳ hàng nào có trong resultset được truy vấn trả về hay không. Trong ví dụ của bạn, nó chỉ gán các giá trị cho biến. Để tham khảo thêm, vui lòng kiểm tra liên kết này: Assigning a variable inside an IF EXISTS clause

Các vấn đề liên quan