Solved

SQL Server - Update order by limit

Posted on 2015-02-20
8
229 Views
Last Modified: 2015-03-05
Hi Experts,

With SQL Server, how does one do something like this?

Update tasks set Status=1 WHERE Status=0 ORDER BY otherColumn LIMIT 1

I've seen this done as a with statement with a select- but this doesn't seem to lock the row - and I need to lock the row...

Thanks,
Mike
0
Comment
Question by:thready
8 Comments
 
LVL 20

Accepted Solution

by:
Russ Suter earned 334 total points
ID: 40621818
The ORDER BY clause is not valid with an update statement. What exactly are you trying to accomplish?
0
 
LVL 13

Expert Comment

by:LIONKING
ID: 40621823
I'm not familiar with the LIMIT, so I can't help you unless you explain a little further what you're trying to do.
0
 
LVL 1

Author Comment

by:thready
ID: 40621834
I have various machines competing to mark N rows in tasks as reserved (as well as their machine name).  I'm trying to avoid collisions because various machines will periodically try to do this...  I guess I need an embedded select statement... but if I do it this way- will I get deadlock errors?
0
Backup Solution for AWS

Read about how CloudBerry Backup fully integrates your backups with Amazon S3 and Amazon Glacier to provide military-grade encryption and dramatically cut storage costs on any platform.

 
LVL 20

Assisted Solution

by:Russ Suter
Russ Suter earned 334 total points
ID: 40621851
I'd be more worried about concurrency errors than deadlock errors. What is your record locking model? Optimistic, pessimistic, other?
0
 
LVL 1

Author Comment

by:thready
ID: 40621873
it's LockReadOnly...  I don't know anything about this, can you explain?
0
 
LVL 1

Author Comment

by:thready
ID: 40621886
I read the docs- I get it- but since it's LockReadonly, I think my problem is with deadlock, not concurrency, right?
0
 
LVL 32

Assisted Solution

by:Daniel Wilson
Daniel Wilson earned 166 total points
ID: 40622227
That syntax is really close to what MySQL supports, but MS SQL Server doesn't.  If your WITH clause gets it for you, good.

Otherwise you may need a stored procedure.

create procedure SetStatus
AS
Begin
 declare @ID int
 Set @ID = (Select top 1 ID from tasks where Status = 0 ORDER BY otherColumn)
 Update tasks set Status=1 WHERE ID=@ID
END

Open in new window


The procedure makes it a transaction which, I think, will take care of your concurrency issues.
0
 
LVL 1

Author Closing Comment

by:thready
ID: 40648442
Thanks everyone
0

Featured Post

NFR key for Veeam Backup for Microsoft Office 365

Veeam is happy to provide a free NFR license (for 1 year, up to 10 users). This license allows for the non‑production use of Veeam Backup for Microsoft Office 365 in your home lab without any feature limitations.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

In this article I will describe the Detach & Attach method as one possible migration process and I will add the extra tasks needed for an upgrade when and where is applied so it will cover all.
In this article I will describe the Backup & Restore method as one possible migration process and I will add the extra tasks needed for an upgrade when and where is applied so it will cover all.
Using examples as well as descriptions, and references to Books Online, show the different Recovery Models available in SQL Server and explain, as well as show how full, differential and transaction log backups are performed
Via a live example, show how to shrink a transaction log file down to a reasonable size.

685 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question