You shouldn't spend much time looking at the back-end of the process - the resultant CSV file.
Begin by looking at the data PRIOR to any output to CSV,,,
"The input SQL tables are built using TSQL stored procedures"
How they are created doesn't matter as long as the SQL tables are successfully created and the records are populated as desired.
"if you look at the data with SSMS, it's there."
So you are saying that the intended records are present and appropriately populated within SQL?
"it's mostly varchars with a few ints and numerics"
Then this should not be a problem.
[I" I don't specify a structure for the VFP cursors, they are built using SQLEXEC. "[/I]
As long as your SQL fields don't exceed 254 char in length or you have BLOB fields, you should be fine. However, in most cases, even if you did have the larger SQL table fields, VFP should receive the fields as MEMO fields - which will not export with a COPY TO command.
Obviously in order to use VFP commands to generate the intended CSV file you have to 'pass' the cursor/table to your Visual Foxpro Express (VFE) somehow.
What does the cursor/table look like immediately after VFE has 'received' it (via Remote View or SQL Pass thru cursor, etc.) before attempting to do the COPY TO?
Are some records as seen in a VFP Browse filled with all NULLs? That might present a problem which can be alleviated by changing NULLs to 0's for numerics or SPACE(0) for characters.
If the VFE 'view', immediately after receipt of the cursor/table is not appropriately populated then you need to investigate how VFE 'receives' the file.
Also you might want to check the SQL output method (SSMS) by sending the results directly to another file type (XLS, TXT, etc.) and checking it there. There could be a problem at that end.
I have never used Visual Fox Express so I do not know if VFE is less functional than VFP (I would hazard a guess that it is), but, assuming everything else checks out, you might want to consider moving up to VFP9 and getting full functionality.
Good Luck,
JRB-Bldr