If I'm not mistaken, since this uses the identity column, it might not always produce the same number of columns. For example, if you deleted a couple rows in the middle, it would still think those rows were there using your between statement.
Why not use top? For example, if you want chucks of 1000 records:
select top 1000 * from a_table order by ID
You can then capture the last identity that was selected and your next statement would be:
select top 1000 * from a_table where ID > @lastident order by ID