Pour moi, SQL est une partie fondamentale (dans de nombreux cas, la majorité) du code de logique métier. Si vous essayez de le séparer du code qui opère sur les données retournées, vous êtes plus enclin à déséquilibrer la compréhensibilité et la maintenabilité du code.
À mon avis, lire des données, traiter des données, écrire des données, rechercher des données ... ce sont toutes des opérations similaires, et il vaut mieux les garder au même endroit.
Si vous commencez à sentir une duplication des efforts avec les requêtes, vous avez peut-être besoin d'une vue de base de données ou d'un objet qui peut encapsuler cet aspect de l'accès à la base de données.
Une autre astuce consiste à avoir une bonne méthode de requête de base de données. Dans les logiciels que j'écris (PostgreSQL, MySQL, SQL Server), j'ai veillé à ce que la majeure partie de mes opérations de requête puisse avoir lieu comme une seule déclaration de code.
GetValue(SQL, [transaction], [array_of_params])
GetRow(SQL, [transaction], [array_of_params])
GetRowList(SQL, [transaction], [array_of_params])
GetValueList(SQL, [transaction], [array_of_params])
Execute(SQL, [transaction], [array_of_params])
Ce sont (grosso modo) les principaux appels de fonction dont je m'assure qu'ils font partie de mon "objet de connexion". Cela dépend de la langue, de ce que vous implémentez réellement, mais mon but est de le garder vraiment, vraiment simple et indolore.
En résumé, traitez SQL comme une partie native de la programmation et n'abstenez pas pour l'abstraction.