I unit test my repositories pretty religiously. They are probably my most important unit tests actually.
This can actually be quite painless if you use an ORM such as NHibernate.
I use a base fixture that contains setup and teardown for creating an in memory sqlite db and then destroying it at the end of each test. This is surprisingly quick. Then for each repository I have a setup that injects my test data for my tests. This is very self contained and catches all the logic issues in my repository queries.
The only thing it doesn't catch is db provider specific cases, but when using something like NHibernate these are usually the exception.
For the special cases where you are testing database specific queries you may need to have a suite of tests that use a different setup and teardown methodology. Unfortunately these tests would be slower and likely more fragile than your other unit tests (that's why they should be grouped together).
If "express" editions of the database software you are testing are available I still recommend that the database be set up locally on the fly so that you always ensure that the database your tests run against has the schema they expect. I would change one part of the setup and teardowns of this though. I would only setup and teardown the database at the beginning and end of the entire run of tests. Then every tests setup and teardown should start a transaction, then roll it back at the end. This is a quick way of keeping things compartmentalized between the tests. The last thing you want is for data from one test to affect another test.