• 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