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: