Don't build data flows like this. They will take a while to validate (components get validated one after another), and you'll get a limited number of them running in parallel since they are all within the same data flow. You also might run into locking issues if all of those sources are hitting the same DB - see Too Many Sources in a Data Flow.
If you have confirmed that all of the Flat File Destinations have their input column mapped, and you're still getting this error, then it could be that there are just too many source/destination mappings for the SSIS data flow to handle/validate properly. You might want to try one of the design alternatives below.
Manageability vs. Performance
When you're working with this many destinations, I'd recommend an approach that is manageable. If the metadata is the same for each of those Source -> Destination mappings, you can do this ETL with a single data flow.
- Create a DB table with "SourceQuery" and "OutputFileName" columns
- Add a row in the table for each source/output mapping
- In the control flow, select all rows from the table
- Set the ResultSet to Full result set
- Store the result in an object variable (objResultSet)
- Use a Foreach Loop Container with an ADO Enumerator to read each row
from objResultSet
- Map the columns in the result set to package variables
- Map the SourceQuery variable to the ADO.NET Source query using
expressions
- Map the OutputFileName variable to the Flat File Connection
Manager's file path
If you feel performance is more important than manageability, and you want to add more parallelism to your scenario, there are a few different things you can consider. The approach you take will depend on how different those source queries are, and whether you want to do calculations at the DB level or within the SSIS data flow. There are a number of ways you can do this - here are some things to keep in mind.
- Using multiple Data Flow Tasks allows for more parallelism, and typically performs better that having multiple sources in a single data flow. The only time you should use multiple sources in a data flow is if you are merging/joining rows (and the join can't be done in the source query)
- If all the data you need can be fit into a single source query, use a single source component and Conditional Split transforms to send rows to the appropriate destinations
- If you need the same rows down multiple paths, use Multicast transforms
- You can calculate sums/counts using the Aggregate Transform, but it can be faster to push this to the source query instead