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
Là 1 tên của một cột trong bảng Timesheet_Hours của bạn? – SirDemon
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. –
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