Alternatively, if you don’t mind generating code that is not optimized for human readability, you could pre-desugar the do-notation and records like this:
spliceStmts [] k = k
spliceStmts (x:xs) k = [| $x >> $(spliceStmts xs k) |]
spliceRevApp f [] = f
spliceRevApp f (x:xs) = [| $(spliceApp f xs) $x |]
...
[d|
$(varE 'sqlSelectProcessRow) cols =
first ((fromString "Failed to parse " ++ $(lift (nameBase name)) ++ ": ") <>)
flip evalStateT cols $
$(spliceStmts statements (spliceRevApp (varE name) (reverse fieldExps)))
|]
Of course there are still some problems that need to be ironed out, like that spliceStmts only supports statements that do not bind variables.
My main gripe with TH quotes is that your second example does not work. Splices fit in places in the syntax where you can fit either a type, an expression or a list of declarations [EDIT: or a pattern]. A name is none of those, nor is the left-hand side of a declaration (like here), or an instance head (the XX in instance ... => XX where). Names occur in many places: if you want to generate a bunch of foreign declarations, or a bunch of function declarations, you’re out of luck even if you’re doing absolutely nothing interesting with the syntax, and the generated Haskell code should work to back in the GHC 7 era.