It is difficult to help you here, without seeing your actual query, and a relevant subset of the two data sets you are operating on.
However, the most common mistake is to get the order of the two statements the wrong way round: Since MINUS returns only those records which ARE in the first set and NOT in the second, (ignoring all those that ARE in the second and NOT in the first) if you swap the order, it is likely to return an empty dataset.
First things first: run your first statement alone into a DataTable, then your second statement alone into another. Compare the two tables (if necessary, dump them into DataGridViews or use DataTable.WriteXML method to let you analyse them offline with a text editor or similar)
If it looks like there should be records after the MINUS, we need to see the queries and a relevant data subset.
OP Added SQL statement:
select top 1 Book_Stock.StockId from Book_Stock,Issue_Book where Book_Stock.BookId='99'
except
select Book_Stock.StockId from Book_Stock,Issue_Book where Book_Stock.StockId = Issue_Book.StockId
That won't work - the first SELECT will only return the top row in the table, which is then checked against the exclusion list. If you want to return the top result of the combined exclusion, you need to nest the queries:
SELECT TOP 1 * FROM myTable WHERE iD IN
(
SELECT iD FROM myTable WHERE iD > 5
EXCEPT
SELECT iD FROM myTable WHERE iD < 10
)
You will have to jiggle it to match what you want to do exactly, but that's the principle.