The order in this case is not guaranteed.
You will tend to get the same results, but there are a few things that can change it. I can think of four examples off the top of my head, but there are likely others:
- If you change the indexing on the table
- With Enterprise Edition, Advanced Scanning can piggy-back on the table or index scan already in progress for another query, where suddenly the "top" result is different.
- If the table is big enough for multiple pages, and one day you happen to have a different page already in memory than before.
- If the table happens to be stored in (A, B) order, but you have an index on (A, B DESC), you might get different result depending on whether the table or the index is already loaded to memory.
Note that a few of these can cause results to change suddenly if memory pressure causes Sql Server to unload a relevant page.
As a more general case, don't think only in terms of one query on the table, but also many different queries on the same unordered data. For example, if you join to this table, based on criteria from another table that matches an index, Sql Server is free to return the first result it finds that matches, and it might be a different row for the join than for the raw query, simply because the join matches well on a different index.
In short, if this matters, be more strict with the ORDER BY clause.