My own method is to create staging tables that either model the current physical architecture of the database, or are completely denormalized to match the anticipated data that will be received. Your staging table should consist primarily of varchar columns with no constraints, so that errors rarely occur when loading data into them. Your stored procedure will actually verify these character columns as valid datetime, int, float, or other datatypes, and note any discrepancies.
I also add auditing columns on each of my staging tables for recording the datasource, the timestamp of when the data was received, and for noting any errors that occurred during processing.