Solved

SQL Server - Update order by limit

Posted on 2015-02-20
8
219 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
 
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
Zoho SalesIQ

Hassle-free live chat software re-imagined for business growth. 2 users, always free.

 
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

Zoho SalesIQ

Hassle-free live chat software re-imagined for business growth. 2 users, always free.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
SQL Server - Slabs 9 40
Add '#' to end of file 2 31
Update data using formula 22 23
Update a summary table with values from detail records 6 0
Occasionally there is a need to clean table columns, especially if you have inherited legacy data. There are obviously many ways to accomplish that, including elaborate UPDATE queries with anywhere from one to numerous REPLACE functions (even within…
JSON is being used more and more, besides XML, and you surely wanted to parse the data out into SQL instead of doing it in some Javascript. The below function in SQL Server can do the job for you, returning a quick table with the parsed data.
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
Viewers will learn how to use the SELECT statement in SQL and will be exposed to the many uses the SELECT statement has.

863 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

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now