Solved

SQL Server - Update order by limit

Posted on 2015-02-20
8
217 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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
I'd be more worried about concurrency errors than deadlock errors. What is your record locking model? Optimistic, pessimistic, other?
0
Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

 
LVL 1

Author Comment

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

Author Comment

by:thready
Comment Utility
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
Comment Utility
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
Comment Utility
Thanks everyone
0

Featured Post

Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Suggested Solutions

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.
Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
Familiarize people with the process of retrieving data from SQL Server using an Access pass-thru query. Microsoft Access is a very powerful client/server development tool. One of the ways that you can retrieve data from a SQL Server is by using a pa…
Using examples as well as descriptions, and references to Books Online, show the documentation available for datatypes, explain the available data types and show how data can be passed into and out of variables.

762 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

9 Experts available now in Live!

Get 1:1 Help Now