Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Server IF NOT EXISTS Usage?

Ok, so my schema is this:

Table: Timesheet_Hours

Columns:

  • Timesheet_Id (PK, int)
  • Staff_Id (int)
  • BookedHours (int)
  • Posted_Flag (boolean)

This is an extremely simplified version of the table, but it will serve for the purposes of this explaination. Assume that a person can only ever have one timesheet record.

What I'm trying to do is add records to another table, called WorkLog. Each record here has a time associated with it. When that table is updated, I want to update Timesheet_Hours as well.

Before I update Timesheet_Hours, I want to check first that the relevant Timesheets haven't already been posted, and then I want to check if there is in fact a record to update in the first place.

The first part of the if statement, which checks to see that the timesheets haven't already been posted, works fine. The problem is the second part. It is checking to see that the record it is going to update already exists. The issue is that it always raises an error.

NB: The code below is extracted from a stored procedure run by the update, insert and delete triggers on the WorkLog table. @PersonID is one of the parameters to that table. The stored procedure works fine if I comment out the second part of this statement.

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 
like image 232
Ryan Kirkman Avatar asked Jul 24 '09 00:07

Ryan Kirkman


People also ask

What is the use if not exists in SQL?

NOT EXISTS is used with a subquery in the WHERE clause to check if the result of the subquery returns TRUE or FALSE. The Boolean value is then used to narrow down the rows from the outer select statement.

How do you check if record not exists in SQL?

To test whether a row exists in a MySQL table or not, use exists condition. The exists condition can be used with subquery. It returns true when row exists in the table, otherwise false is returned. True is represented in the form of 1 and false is represented as 0.

How do you use exists and not exists in SQL?

Use EXISTS to identify the existence of a relationship without regard for the quantity. For example, EXISTS returns true if the subquery returns any rows, and [NOT] EXISTS returns true if the subquery returns no rows. The EXISTS condition is considered to be met if the subquery returns at least one row.

Which is faster exists or not exists in SQL?

There is no difference.


1 Answers

Have you verified that there is in fact a row where Staff_Id = @PersonID? What you've posted works fine in a test script, assuming the row exists. If you comment out the insert statement, then the error is raised.

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 
like image 164
Rick Avatar answered Oct 13 '22 16:10

Rick