Don't confuse "columns" with "rows". Assuming a flat file structure (non relational DB), 2000 columns only references 2000 "fields" within any given record (aka row). I doubt there's a cap on records within the SQL db. The only cap would be in how big you define what a "contact" is.
The more data (columns containing data) in a record, i.e. columns = phone, email, street address, fax, etc. etc. the more memory that one record/contact will consume.
The other variable would be how much memory do you have free.
Finally, it is possible (not knowing how the system runs) that there would be some performance issues if you had an iPhone dedicated only to storing contact info (no music, no videos, etc.), and it was maxed out.
If you assume that a standard contact entry had around 100 bytes of data (each byte being a character in the alphabet, plus a little overhead), and you had 7Gb of storage free, that would translate to a theoretical storage capacity of 70 million entries.
Call me a nerd! 😉