2009-07-24 39 views
29

Ok, vậy schema của tôi là thế này:SQL Server NẾU KHÔNG SỬ DỤNG SỬ DỤNG?

Bảng: Timesheet_Hours

Cột:

  • Timesheet_Id (PK, int)
  • Staff_Id (int)
  • BookedHours (int)
  • Đã đăng_Flag (boolean)

Đây là phiên bản cực kỳ đơn giản của bảng, nhưng nó sẽ phục vụ cho mục đích giải thích này. Giả sử rằng một người chỉ có thể có một bản ghi thời gian biểu.

Điều tôi đang cố gắng làm là thêm bản ghi vào bảng khác, được gọi là WorkLog. Mỗi bản ghi ở đây có một thời gian liên kết với nó. Khi bảng đó được cập nhật, tôi cũng muốn cập nhật Timesheet_Hours.

Trước khi tôi cập nhật Timesheet_Hours, tôi muốn kiểm tra trước rằng Timesheets có liên quan chưa được đăng, và sau đó tôi muốn kiểm tra xem có thực sự là bản ghi để cập nhật ngay từ đầu không.

Phần đầu tiên của câu lệnh if, kiểm tra xem các bảng chấm công chưa được đăng, hoạt động tốt. Vấn đề là phần thứ hai. Đó là kiểm tra để thấy rằng bản ghi nó sẽ cập nhật đã tồn tại. Vấn đề là nó luôn luôn gây ra lỗi.

NB: Mã bên dưới được trích xuất từ ​​quy trình được lưu trữ do bản cập nhật, chèn và xóa trình kích hoạt trên bảng WorkLog. @PersonID là một trong các tham số cho bảng đó. Thủ tục lưu trữ hoạt động tốt nếu tôi nhận xét phần thứ hai của câu lệnh này.

IF EXISTS 
    (
    SELECT 1 
    FROM Timesheet_Hours 
    WHERE Posted_Flag = 1 
    AND Staff_Id = @PersonID 
    ) 

    BEGIN 
     RAISERROR('Timesheets have already been posted!', 16, 1) 
     ROLLBACK TRAN 
    END 
ELSE 
    IF NOT EXISTS 
     (
     SELECT 1 
     FROM Timesheet_Hours 
     WHERE Staff_Id = @PersonID 
     ) 

     BEGIN 
      RAISERROR('Default list has not been loaded!', 16, 1) 
      ROLLBACK TRAN 
     END 
+0

Là 1 tên của một cột trong bảng Timesheet_Hours của bạn? – SirDemon

+1

Không, nó không phải là. Khi tôi đang sử dụng EXISTS, tôi đã làm theo những gì tôi nghĩ là thực hành tiêu chuẩn trong các truy vấn con bằng cách sử dụng EXISTS. –

+2

1 trong trường hợp đó chỉ là một hằng số. Tất cả những gì anh ta quan tâm là một hàng được trả về, không phải là giá trị của bất kỳ cột nào. Sử dụng hằng số thường nhanh hơn sử dụng * hoặc danh sách cột cụ thể. – Rick

Trả lời

32

Bạn đã xác minh rằng thực tế có một hàng nơi Staff_Id = @PersonID? Những gì bạn đã đăng hoạt động tốt trong tập lệnh thử nghiệm, giả sử hàng tồn tại. Nếu bạn nhận xét câu lệnh chèn, thì lỗi được nêu ra.

set nocount on 

create table Timesheet_Hours (Staff_Id int, BookedHours int, Posted_Flag bit) 

insert into Timesheet_Hours (Staff_Id, BookedHours, Posted_Flag) values (1, 5.5, 0) 

declare @PersonID int 
set @PersonID = 1 

IF EXISTS  
    (
    SELECT 1  
    FROM Timesheet_Hours  
    WHERE Posted_Flag = 1  
     AND Staff_Id = @PersonID  
    )  
    BEGIN 
     RAISERROR('Timesheets have already been posted!', 16, 1) 
     ROLLBACK TRAN 
    END 
ELSE 
    IF NOT EXISTS 
     (
     SELECT 1 
     FROM Timesheet_Hours 
     WHERE Staff_Id = @PersonID 
     ) 
     BEGIN 
      RAISERROR('Default list has not been loaded!', 16, 1) 
      ROLLBACK TRAN 
     END 
    ELSE 
     print 'No problems here' 

drop table Timesheet_Hours 
+0

Cảm ơn bạn đời. Hóa ra tôi đã không chuyển đúng PersonID từ trình kích hoạt INSERT. Nó đã gây nhầm lẫn cho tôi bởi vì nó đã làm việc với các trigger UPDATE và DELETE, nhưng tôi không nghĩ rằng để kiểm tra các tham số. –

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